I would disagree. It's true that the AttributeInstance is a pair in its current form, but it is cleaner than a string and allows future extensions (adding new properties and functionalities to the attribute instances). 

And I believe the correct implementation for reverseInstanceMap is a Map from content (String) to the attribute instances (Set<AttributeInstance>>). Since attribute instances store a reference to the schema instance, changing that map to a map from content to schema instances does not really change the semantics, does it? 

If you agree with these points, let's revert this part of the change. LGTM to the other parts.