diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,12 @@
 The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
 and this project adheres to the [Haskell Package Versioning Policy](https://pvp.haskell.org/).
 
+## 2.1.0.0 -- 2023-06-28
+
+* Change the order of the type arguments to `UnliftedArray_` and
+  `MutableUnliftedArray_`. This makes the library work better with
+  the typeclasses in the `contiguous` library.
+
 ## 2.0.0.0 -- 2023-06-27
 
 * Use legitimate unlifted primitive types and operations, only supporting
diff --git a/primitive-unlifted.cabal b/primitive-unlifted.cabal
--- a/primitive-unlifted.cabal
+++ b/primitive-unlifted.cabal
@@ -1,6 +1,6 @@
 cabal-version: 2.2
 name: primitive-unlifted
-version: 2.0.0.0
+version: 2.1.0.0
 synopsis: Primitive GHC types with unlifted types inside
 description:
   Primitive GHC types with unlifted types inside. There used
diff --git a/src/Data/Primitive/TArray/Classic.hs b/src/Data/Primitive/TArray/Classic.hs
--- a/src/Data/Primitive/TArray/Classic.hs
+++ b/src/Data/Primitive/TArray/Classic.hs
@@ -33,7 +33,7 @@
   , _ub :: !i         -- the upper bound
   , range :: !Int    -- A cache of (rangeSize (l, u))
                      -- used to make sure an index is really in range
-  , arr :: !(UnliftedArray_ (TVar a) (TVar# RealWorld a))
+  , arr :: !(UnliftedArray_ (TVar# RealWorld a) (TVar a))
   }
 type role TArray nominal representational
 
diff --git a/src/Data/Primitive/Unlifted/Array/ST.hs b/src/Data/Primitive/Unlifted/Array/ST.hs
--- a/src/Data/Primitive/Unlifted/Array/ST.hs
+++ b/src/Data/Primitive/Unlifted/Array/ST.hs
@@ -77,32 +77,32 @@
 -- It is expected that @unlifted_a ~ Unlifted a@, but imposing that constraint
 -- here would force the type roles to @nominal@, which is often undesirable
 -- when arrays are used as components of larger datatypes.
-data UnliftedArray_ a unlifted_a
+data UnliftedArray_ unlifted_a a
   = UnliftedArray (UnliftedArray# unlifted_a)
-type role UnliftedArray_ phantom representational
+type role UnliftedArray_ representational phantom 
 
 -- | A type synonym for an 'UnliftedArray_' containing lifted values of
 -- a particular type. As a general rule, this type synonym should not be used in
 -- class instances—use 'UnliftedArray_' with an equality constraint instead.
 -- It also should not be used when defining newtypes or datatypes, unless those
 -- will have restrictive type roles regardless—use 'UnliftedArray_' instead.
-type UnliftedArray a = UnliftedArray_ a (Unlifted a)
+type UnliftedArray a = UnliftedArray_ (Unlifted a) a
 
 -- | A mutable version of 'UnliftedArray_'.
-data MutableUnliftedArray_ s a unlifted_a
+data MutableUnliftedArray_ unlifted_a s a
   = MutableUnliftedArray (MutableUnliftedArray# s unlifted_a)
-type role MutableUnliftedArray_ nominal phantom representational
+type role MutableUnliftedArray_ representational nominal phantom 
 
 -- | A mutable version of 'MutableUnliftedArray'.
-type MutableUnliftedArray s a = MutableUnliftedArray_ s a (Unlifted a)
+type MutableUnliftedArray s a = MutableUnliftedArray_ (Unlifted a) s a
 
-instance unlifted_a ~ Unlifted a => PrimUnlifted (UnliftedArray_ a unlifted_a) where
-  type Unlifted (UnliftedArray_ _ unlifted_a) = UnliftedArray# unlifted_a
+instance unlifted_a ~ Unlifted a => PrimUnlifted (UnliftedArray_ unlifted_a a) where
+  type Unlifted (UnliftedArray_ unlifted_a _) = UnliftedArray# unlifted_a
   toUnlifted# (UnliftedArray a) = a
   fromUnlifted# x = UnliftedArray x
 
-instance unlifted_a ~ Unlifted a => PrimUnlifted (MutableUnliftedArray_ s a unlifted_a) where
-  type Unlifted (MutableUnliftedArray_ s _ unlifted_a) = MutableUnliftedArray# s unlifted_a
+instance unlifted_a ~ Unlifted a => PrimUnlifted (MutableUnliftedArray_ unlifted_a s a) where
+  type Unlifted (MutableUnliftedArray_ unlifted_a s _) = MutableUnliftedArray# s unlifted_a
   toUnlifted# (MutableUnliftedArray a) = a
   fromUnlifted# x = MutableUnliftedArray x
 
@@ -182,8 +182,8 @@
 -- | Determines whether two 'MutableUnliftedArray' values are the same. This is
 -- object/pointer identity, not based on the contents.
 sameMutableUnliftedArray
-  :: MutableUnliftedArray s a
-  -> MutableUnliftedArray s a
+  :: MutableUnliftedArray_ unlifted_a s a
+  -> MutableUnliftedArray_ unlifted_a s a
   -> Bool
 sameMutableUnliftedArray (MutableUnliftedArray maa1#) (MutableUnliftedArray maa2#)
   = Exts.isTrue# (sameMutableUnliftedArray# maa1# maa2#)
@@ -338,7 +338,7 @@
   = ST $ \s -> case cloneMutableUnliftedArray# mary off len s of
       (# s', mary' #) -> (# s', MutableUnliftedArray mary' #)
 
-emptyUnliftedArray :: UnliftedArray a
+emptyUnliftedArray :: UnliftedArray_ unlifted_a a
 emptyUnliftedArray = UnliftedArray (emptyUnliftedArray# (##))
 
 singletonUnliftedArray :: PrimUnlifted a => a -> UnliftedArray a
@@ -512,28 +512,28 @@
     go vs 0
 
 instance (PrimUnlifted a, unlifted_a ~ Unlifted a)
-  => Exts.IsList (UnliftedArray_ a unlifted_a) where
-  type Item (UnliftedArray_ a _) = a
+  => Exts.IsList (UnliftedArray_ unlifted_a a) where
+  type Item (UnliftedArray_ _ a) = a
   fromList = unliftedArrayFromList
   fromListN = unliftedArrayFromListN
   toList = unliftedArrayToList
 
 instance (PrimUnlifted a, unlifted_a ~ Unlifted a)
-  => Semigroup (UnliftedArray_ a unlifted_a) where
+  => Semigroup (UnliftedArray_ unlifted_a a) where
   (<>) = concatUnliftedArray
 
-instance (PrimUnlifted a, unlifted_a ~ Unlifted a) => Monoid (UnliftedArray_ a unlifted_a) where
+instance (PrimUnlifted a, unlifted_a ~ Unlifted a) => Monoid (UnliftedArray_ unlifted_a a) where
   mempty = emptyUnliftedArray
 
-instance (Show a, PrimUnlifted a, unlifted_a ~ Unlifted a) => Show (UnliftedArray_ a unlifted_a) where
+instance (Show a, PrimUnlifted a, unlifted_a ~ Unlifted a) => Show (UnliftedArray_ unlifted_a a) where
   showsPrec p a = showParen (p > 10) $
     showString "fromListN " . shows (sizeofUnliftedArray a) . showString " "
       . shows (unliftedArrayToList a)
 
-instance unlifted_a ~ Unlifted a => Eq (MutableUnliftedArray_ s a unlifted_a) where
+instance unlifted_a ~ Unlifted a => Eq (MutableUnliftedArray_ unlifted_a s a) where
   (==) = sameMutableUnliftedArray
 
-instance (Eq a, PrimUnlifted a, unlifted_a ~ Unlifted a) => Eq (UnliftedArray_ a unlifted_a) where
+instance (Eq a, PrimUnlifted a, unlifted_a ~ Unlifted a) => Eq (UnliftedArray_ unlifted_a a) where
   aa1 == aa2 = sizeofUnliftedArray aa1 == sizeofUnliftedArray aa2
             && loop (sizeofUnliftedArray aa1 - 1)
    where
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -6,6 +6,7 @@
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE StandaloneDeriving #-}
 {-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
 
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 
@@ -83,7 +84,7 @@
         writePrimArray a ix x
       unsafeFreezePrimArray a
 
-instance (Arbitrary a, PrimUnlifted a, Unlifted a ~ b) => Arbitrary (UnliftedArray_ a b) where
+instance (Arbitrary b, PrimUnlifted b, Unlifted b ~ a) => Arbitrary (UnliftedArray_ a b) where
   arbitrary = do
     xs <- QC.vector =<< QC.choose (0,3)
     return (unliftedArrayFromList xs)
