The solution to this problem is to introduce Assumptions on variables x and y. There is a way to formulate global assumptions or you can add the assumptions as options to Simplify or to a few other Mathematica functions. Details are best seen from the Documentation concerning Assumptions (you know the convenient access via the F1-key to the documentation?).
You may probably wonder why Mathematica does not follow the established paradigm of object oriented languages. I'm not in a position to answer this question. As it appears to me, the more recent versions of Mathematica made some steps on the way to incorporate the type-concept into the language. I would suspect that the end of this way is not yet reached.
Sorry Sean, I overlooked that you did not only write on ComplexExpand that also about Assumptions!