diff --git a/morpheus-graphql-core.cabal b/morpheus-graphql-core.cabal
--- a/morpheus-graphql-core.cabal
+++ b/morpheus-graphql-core.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           morpheus-graphql-core
-version:        0.27.2
+version:        0.27.3
 synopsis:       Morpheus GraphQL Core
 description:    Build GraphQL APIs with your favorite functional language!
 category:       web, graphql
@@ -251,9 +251,9 @@
     , template-haskell >=2.0.0 && <3.0.0
     , text >=1.2.3 && <3.0.0
     , th-lift-instances >=0.1.1 && <0.3.0
-    , transformers >=0.3.0 && <0.6.0
+    , transformers >=0.3.0 && <0.7.0
     , unordered-containers >=0.2.8 && <0.3.0
-    , vector >=0.12.0.1 && <0.13.0
+    , vector >=0.12.0.1 && <0.15.0
   default-language: Haskell2010
 
 test-suite morpheus-graphql-core-test
@@ -282,7 +282,7 @@
     , template-haskell >=2.0.0 && <3.0.0
     , text >=1.2.3 && <3.0.0
     , th-lift-instances >=0.1.1 && <0.3.0
-    , transformers >=0.3.0 && <0.6.0
+    , transformers >=0.3.0 && <0.7.0
     , unordered-containers >=0.2.8 && <0.3.0
-    , vector >=0.12.0.1 && <0.13.0
+    , vector >=0.12.0.1 && <0.15.0
   default-language: Haskell2010
diff --git a/src/Data/Mergeable/OrdMap.hs b/src/Data/Mergeable/OrdMap.hs
--- a/src/Data/Mergeable/OrdMap.hs
+++ b/src/Data/Mergeable/OrdMap.hs
@@ -17,6 +17,7 @@
 
 module Data.Mergeable.OrdMap
   ( OrdMap,
+    ordMapDelete,
   )
 where
 
@@ -73,7 +74,7 @@
 instance (NameCollision e a, Eq k, Hashable k, Monad m, MonadError e m) => Merge m (OrdMap k a) where
   merge (OrdMap ks1 x) (OrdMap ks2 y) = OrdMap (mergeOrder ks1 ks2) <$> merge x y
 
-mergeOrder :: Eq a => [a] -> [a] -> [a]
+mergeOrder :: (Eq a) => [a] -> [a] -> [a]
 mergeOrder ks1 ks2 = ks1 <> (ks2 \\ ks1)
 
 instance
@@ -85,3 +86,7 @@
   FromList m OrdMap k a
   where
   fromList xs = OrdMap (map fst xs) <$> fromList xs
+
+ordMapDelete :: (Eq k, Hashable k) => k -> OrdMap k a -> OrdMap k a
+ordMapDelete k (OrdMap order entries) =
+  OrdMap (filter (k /=) order) (HM.delete k entries)
diff --git a/src/Data/Morpheus/Types/Internal/AST/TypeSystem.hs b/src/Data/Morpheus/Types/Internal/AST/TypeSystem.hs
--- a/src/Data/Morpheus/Types/Internal/AST/TypeSystem.hs
+++ b/src/Data/Morpheus/Types/Internal/AST/TypeSystem.hs
@@ -474,9 +474,10 @@
   Schema s ->
   [TypeDefinition ANY s]
 possibleInterfaceTypes name schema =
-  mapMaybe
-    (isPossibleInterfaceType name)
-    (toList $ typeDefinitions schema)
+  sortWith typeName $
+    mapMaybe
+      (isPossibleInterfaceType name)
+      (toList $ typeDefinitions schema)
 
 isPossibleInterfaceType ::
   TypeName ->
diff --git a/src/Data/Morpheus/Validation/Query/UnionSelection.hs b/src/Data/Morpheus/Validation/Query/UnionSelection.hs
--- a/src/Data/Morpheus/Validation/Query/UnionSelection.hs
+++ b/src/Data/Morpheus/Validation/Query/UnionSelection.hs
@@ -16,14 +16,15 @@
 where
 
 import Control.Monad.Except (MonadError (throwError))
-import qualified Data.HashMap.Lazy as HM
-import Data.Mergeable (OrdMap)
+import Data.Mergeable (IsMap (toAssoc), OrdMap)
+import Data.Mergeable.OrdMap (ordMapDelete)
 import Data.Morpheus.Internal.Utils
   ( empty,
     fromElems,
     mergeConcat,
     selectOr,
     startHistory,
+    unsafeFromList,
   )
 import Data.Morpheus.Types.Internal.AST.DirectiveLocation (DirectiveLocation (..))
 import Data.Morpheus.Types.Internal.AST.Name (TypeName)
@@ -100,11 +101,11 @@
 tagUnionFragments ::
   [UnionTag] ->
   OrdMap TypeName (TypeDefinition IMPLEMENTABLE VALID) ->
-  HashMap TypeName [SelectionSet VALID]
+  OrdMap TypeName [SelectionSet VALID]
 tagUnionFragments fragments types = fmap categorizeType getSelectedTypes
   where
-    getSelectedTypes :: HashMap TypeName [TypeName]
-    getSelectedTypes = fromList (map select fragments)
+    getSelectedTypes :: OrdMap TypeName [TypeName]
+    getSelectedTypes = unsafeFromList (map select fragments)
       where
         select UnionTag {unionTagName} =
           ( unionTagName,
@@ -135,19 +136,19 @@
 
 joinClusters ::
   Maybe (SelectionSet VALID) ->
-  HashMap TypeName [SelectionSet VALID] ->
+  OrdMap TypeName [SelectionSet VALID] ->
   FragmentValidator s (SelectionContent VALID)
 joinClusters maybeSelSet typedSelections
   | null typedSelections = maybe noEmptySelection (pure . SelectionSet) maybeSelSet
   | otherwise =
-      traverse mkUnionTag (HM.toList typedSelections)
+      traverse mkUnionTag (toAssoc typedSelections)
         >>= fmap (UnionSelection maybeSelSet) . startHistory . fromElems
   where
     mkUnionTag :: (TypeName, [SelectionSet VALID]) -> FragmentValidator s UnionTag
     mkUnionTag (typeName, fragments) = UnionTag typeName <$> (maybeMerge (toList maybeSelSet <> fragments) >>= maybe noEmptySelection pure)
 
 validateInterfaceSelection ::
-  ValidateFragmentSelection s =>
+  (ValidateFragmentSelection s) =>
   (Fragment RAW -> FragmentValidator s (SelectionSet VALID)) ->
   (TypeDefinition IMPLEMENTABLE VALID -> SelectionSet RAW -> FragmentValidator s (SelectionSet VALID)) ->
   TypeDefinition IMPLEMENTABLE VALID ->
@@ -163,13 +164,13 @@
     validSelectionSet <- traverse (validate typeDef) selectionSet
     let tags = tagUnionFragments spreads possibleTypes
     defaultSelection <- maybeMerge (toList validSelectionSet <> selectOr [] id typeName tags)
-    joinClusters defaultSelection (HM.delete typeName tags)
+    joinClusters defaultSelection (ordMapDelete typeName tags)
 
 mkUnionRootType :: FragmentValidator s (TypeDefinition IMPLEMENTABLE VALID)
 mkUnionRootType = (`mkType` DataObject [] empty) <$> asksScope currentTypeName
 
 validateUnionSelection ::
-  ValidateFragmentSelection s =>
+  (ValidateFragmentSelection s) =>
   (Fragment RAW -> FragmentValidator s (SelectionSet VALID)) ->
   (TypeDefinition IMPLEMENTABLE VALID -> SelectionSet RAW -> FragmentValidator s (SelectionSet VALID)) ->
   UnionTypeDefinition OUT VALID ->
