RAM just hasn't gotten cheaper at the same rate as clock cycles. Offering lots of memory for very little additional money couldn't possibly be cost-effective, unless Amazon is also memory-constrained for most of their applications.
Regardless, you can almost always trade CPU time and/or IO for memory in webapps. Limit your RAM caching, and move less-frequently-used data to temporary files on disk. Be more judicious in your SQL, so that you don't return large result sets to your application servers which then get filtered further in your business logic. Hell, run one or two fewer app server processes to begin with, and just bring up another EC2 image to handle load if you need it.
Regardless, you can almost always trade CPU time and/or IO for memory in webapps. Limit your RAM caching, and move less-frequently-used data to temporary files on disk. Be more judicious in your SQL, so that you don't return large result sets to your application servers which then get filtered further in your business logic. Hell, run one or two fewer app server processes to begin with, and just bring up another EC2 image to handle load if you need it.