Facets provide a way to extend a type system by loosely coupling new type instances to existing ones. This shifts the type selection process from compile to run time and implements a form of late binding. Due to their loose coupling among each other, facets are better suited to solve the versioning problem than other approaches. However, facets are not a panacea that would solve the versioning problem for free, and careful design is still necessary to come up with versioned systems that remain understandable and maintain consistent semantics.