EC2 - By far the most flexible and mature of the bunch. EC2 supports Linux, and Windows along with any of the software for those systems. It also has a vast and flexible set of solutions for storage, backups, and file distribution. It can also be fairly expensive, depending upon your needs (the nickels and dimes for each service can add up quickly). EC2 is "low-level" in that it is essentially a management tool for virtual OSes in a data center. For that reason, while it is easy to migrate to and from (you just boot the OS and start running your software), it requires more work or resources to scale with your workload.
Azure - From what I've seen (very little) its still fairly immature. AFAIK, pricing has not yet been announced.
GAE - Supports most of Python and a limited amount of Java. If your needs fit into its strict limitations, it can be useful. However, it does have limits that prevent many off-the-shelf applications from working. Also, storage options for large files are very limited. OTOH, it is fairly cheap, with a free starter edition that is suitable for starting up projects. In addition to technical limitations, Google has not shown the level of transparency and commitment to App Engine as Amazon has to EC2, for example. Specifically, note the number of issues that go months without even acknowledgement (much less official response) in the App Engine the issue tracker.
In the end, which one is best for you (if any) is very dependent upon your application and what you are trying to accomplish.