Subtyped strings are only really useful if you can guarantee that it indeed has that subtype (e.g. doesn't contain NULL). That means that only the "owner" of the subtype should be able to set a string to that subtype.
Isn't it a set you would really want, like string("upper_cased"|"no_nulls") or should you throw away/regain type information for calls to functions which accepts different types?