The NSLocaleKey type is used for the argument to objectForKey and displayNameForKey methods. It's not supposed to be the type of the identifier (which is a string).
Locale identifiers are basically a little mini-language themselves. They can have a lot of components. Check out the example in this documentation:
Examples of locale identifiers include "en_GB", "es_ES_PREEURO", and "zh-Hant_HK_POSIX@collation=pinyin;currency=CNY".
The purpose of Locale is to be the strong type which is created with one of these strings, providing type safe access to the attributes of the locale via properties. So I don't think we need another Identifier type, as that type is Locale itself.
I can see the argument that language, country, currency codes may make more sense as a nested strong type. However, in order to have a complete story here, there would have to be other APIs that take only those kinds of things (and currently takes Strings). Otherwise, the result just becomes annoying to use because you have to convert it to something more useful first (like a string).