Devices that don't support IPv6, or don't have IPv6 enabled, will just share an IPV4 address in a NAT pool at the ISP level. It's not pretty but it works.
Sort of. There are some very real limitations what what how much you can NAT too.
Never mind what happens when various services break due to double NATing and the various port filtering, think VOIP and the like. Probably not terribly difficult for a few P2P programs to DoS your ISP wide NAT as well.
Most of your software doesn't support IPv6, which I think is a bigger problem. Most everything that works with sockets assumes that a network address fits in a machine int type; IPv6 addresses aren't even scalar.
You mentioned twice that IPv6 addresses aren't scalar in this discussion. Why?
Are you talking about the scope identifier or the flow label? The scope identifier is not used by the Network Layer, it is used to disambiguate between addresses in different Data Link Layer outputs by the operating system, but plays no role in routing after the packet leaves the network card. There is no field for it in the IPv6 packet.
The flow label is part of the IPv6 packet, but it is used for routing and quality of service, it is not used for addressing.
So, the IPv6 address is actually just a 128-bit scalar integer, that goes from 0 to 340282366920938463463374607431768211455, with different sub-ranges designated to different purposes.
In very few languages people use today is there a 128 bit scalar integer type. You're right to point out that I'm being imprecise with my terms, but I think now you get what I'm saying.
I really thought people would get serious about it 2 years ago.