After a little more research, I can see that as a work around is:
foo = np.append(foo, np.asanyarray([1., 2., 3.], dtype=foo.dtype))
It seems that within numpy.append(), the call to ravel() (numpy/ function.base.py [line 3490]) produces an array with a dtype that best fits. In this case it is float64 (when my original array was float32).