diff --git a/contiguous.cabal b/contiguous.cabal
--- a/contiguous.cabal
+++ b/contiguous.cabal
@@ -1,6 +1,6 @@
 cabal-version: 2.0
 name: contiguous
-version: 0.4
+version: 0.4.0.1
 homepage: https://github.com/andrewthad/contiguous
 bug-reports: https://github.com/andrewthad/contiguous/issues
 author: Andrew Martin
@@ -26,8 +26,9 @@
     Data.Primitive.Contiguous
   hs-source-dirs: src
   build-depends:
-      base >=4.9 && <5
-    , primitive >= 0.6.4
+      base >=4.11.1.0 && <5
+    , primitive >= 0.7 && < 0.8
+    , primitive-unlifted >= 0.1 && < 0.2
     , deepseq >= 1.4
   default-language: Haskell2010
   ghc-options: -O2 -Wall
diff --git a/src/Data/Primitive/Contiguous.hs b/src/Data/Primitive/Contiguous.hs
--- a/src/Data/Primitive/Contiguous.hs
+++ b/src/Data/Primitive/Contiguous.hs
@@ -146,6 +146,8 @@
 import Data.Bits (xor)
 import Data.Kind (Type)
 import Data.Primitive hiding (fromList,fromListN)
+import Data.Primitive.Unlifted.Array
+import Data.Primitive.Unlifted.Class (PrimUnlifted)
 import Data.Semigroup (Semigroup,(<>))
 import Data.Word (Word8)
 import GHC.Base (build)
@@ -307,8 +309,8 @@
      in go 0
   clone = cloneSmallArray
   cloneMutable = cloneSmallMutableArray
-  lift = fromArrayArray#
-  unlift = toArrayArray#
+  lift x = SmallArray (unsafeCoerce# x)
+  unlift (SmallArray x) = unsafeCoerce# x
   copy = copySmallArray
   copyMutable = copySmallMutableArray
   replicateMutable = replicateSmallMutableArray
@@ -363,8 +365,8 @@
   clone = clonePrimArray
   cloneMutable = cloneMutablePrimArray
   equals = (==)
-  unlift = toArrayArray#
-  lift = fromArrayArray#
+  unlift (PrimArray x) = unsafeCoerce# x
+  lift x = PrimArray (unsafeCoerce# x)
   null (PrimArray a) = case sizeofByteArray# a of
     0# -> True
     _ -> False
@@ -435,8 +437,8 @@
   clone = cloneArray
   cloneMutable = cloneMutableArray
   equals = (==)
-  unlift = toArrayArray#
-  lift = fromArrayArray#
+  unlift (Array x) = unsafeCoerce# x
+  lift x = Array (unsafeCoerce# x)
   null (Array a) = case sizeofArray# a of
     0# -> True
     _ -> False
@@ -509,8 +511,8 @@
   clone = cloneUnliftedArray
   cloneMutable = cloneMutableUnliftedArray
   equals = (==)
-  unlift = toArrayArray#
-  lift = fromArrayArray#
+  unlift (UnliftedArray x) = x
+  lift x = UnliftedArray x
   null (UnliftedArray a) = case sizeofArrayArray# a of
     0# -> True
     _ -> False
@@ -592,10 +594,6 @@
   copyMutableUnliftedArray dst 0 src 0 (min sz (sizeofMutableUnliftedArray src))
   pure dst
 {-# inline resizeUnliftedArray #-}
-
-emptyUnliftedArray :: UnliftedArray a
-emptyUnliftedArray = runST (unsafeNewUnliftedArray 0 >>= unsafeFreezeUnliftedArray)
-{-# noinline emptyUnliftedArray #-}
 
 -- | Append two arrays.
 append :: (Contiguous arr, Element arr a) => arr a -> arr a -> arr a
