This hides the language-specific flags and lets each language define its own fields in the opaquer storage.
It doesn't look like this setter is needed, as the single usage has now been changed to a constructor argument. And if this is immutable, then in turn some methods of TypePayloadClang become unneeded (SetIsCompleteObjCClass)
maybe make this explicit too (and augment it with a encode method to make the usage less weird)?
Could you make the uint32_t a typedef? I'm fine with this not being type-safe, but a typedef would at least allow me to search for where this information is used. Grepping/searching for uint32_t isn't a great experience. It would also make this interface more self-documenting.
Beside that LGTM.