The lack of standards for virtual machines presents a very significant problem for users.
Depending on how you've deployed your applications, you either have portability or you don't. Generally speaking you will be stuck (for better or worse) with your VM image vendor, assuming you had a choice in the first place.
I spoke to John Pozadzides, chief marketing officer of LayeredTech, a hosting provider that has deployed a lot of grid-oriented infrastructure.
My main question for Pozadzides: what happens if I want to move my stuff?
Unfortunately there is no clear answer. It all depends on the VMs you are using (assuming you are using VMs at all) and if there is another cloud option. Otherwise you may have to go internal. For example, if you use Google App Engine, there are other Python hosts available but they probably don't have the Google-scale. At that point, you have to move those servers into your own environment (hosted or internal).
A couple of possibilities on migration:
1. You could set up the same VM infrastructure and replicate.
2. You could set up physical server resources and do a migration.
It seems like its very difficult to move from say VMware to Xen or vice versa. Hence, the need for Java-in-the-Cloud where VMs are just a deployment option.
There is a very large risk of cloud lock-in, though I'm not sure that it matters as long as you have a way to get off of a specific provider.