169.254.0.0/16 is NOT "private" addressing. It is "Link Local" addressing.
However, as stated, Link Local addressing in IPv4 is very different (and much less useful) than Link Local addressing in IPv6.
In IPv6, you can't get global connectivity or a global scope address (except a statically assigned one) without first having a link local address. Link local addresses are used for resolving next hop routers, for OSPF adjacencies, for SLAAC and DHCPv6 and many other things in IPv6.
fd00::/8 (ULA Random) has a somewhat similar purpose and ideology to RFC-1918 addressing (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), but is quite different. In theory, you should use a reliably random process for producing the 40 bits needed (the x digits in fdxx:xxxx:xxxx::/48) to create a /48 prefix. Theoretically, this should make collisions among organizations joining their ULA addressed networks unlikely.
fc00::/8 (the other half of fc00::/7) was intended to be ULA registered, but the RFC received strong opposition and did not achieve consensus. The draft expired and while IANA has reserved fc00::/7 for ULA and fd00::/8 is designated for ULA Random, there is no RFC setting standards or enabling use of fc00::/8 at this time.
A host which has global IPv6 will have an interface report similar to the following:
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet6 fe80::c19:132b:7ba:abc2%en0 prefixlen 64 secured scopeid 0x7
inet6 2001:db8:930::200:5 prefixlen 64
inet xxx.xxx.xxx.5 netmask 0xffffff00 broadcast xxx.xxx.xxx.255
media: autoselect (1000baseT <full-duplex,flow-control>)
(The above is a statically assigned interface)
Note, however, that it still has both a Link Local address (fe80::c19:132b:7ba:abc2/64) and a Global Unicast Address (2001:db8:930::5/64).
I've changed the IPv6 prefix to the one reserved for documentation and redacted the IPv4 prefix.