* The HTTP Host: header means that you don't need a public IP address for every site. Heck, it would even be possible to have a single public IP for a load balancer that redistributes requests to a data center full of servers that serve requests for thousands of sites. If you think this can't be done efficiently, think about these Cnoection: and oCnnection: headers that pop up with load balancers that only rewrite part of the header.
* NAT means that we only have one IP per Internet-connected household, not one per computer or other device. With mounting pressure, mobile operators will increasingly put their users behind NAT and maybe some people in address-starved regions of the world will only be able to get NATted connections from their provider. Software like Skype knows how to get around NAT pretty well, and UPnP works pretty well for other server-like programs that people have.
Which means that 99% of the people will be perfectly happy with multiple-occupancy HTTP service and UPnP/firewall piercing and not care at all whether IPv4 addresses run out or not. The remaining 1% will have to push very hard, and pay a significant fraction of the cost, to get IPv6 off the ground all while the incumbents sit in a corner and watch.