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.3.1.0
+version: 0.3.2.0
 homepage: https://github.com/andrewthad/contiguous
 bug-reports: https://github.com/andrewthad/contiguous/issues
 author: Andrew Martin
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
@@ -67,6 +67,7 @@
   size :: Element arr b => arr b -> Int
   sizeMutable :: (PrimMonad m, Element arr b) => Mutable arr (PrimState m) b -> m Int
   unsafeFreeze :: PrimMonad m => Mutable arr (PrimState m) b -> m (arr b)
+  thaw :: (PrimMonad m, Element arr b) => arr b -> Int -> Int -> m (Mutable arr (PrimState m) b)
   copy :: (PrimMonad m, Element arr b) => Mutable arr (PrimState m) b -> Int -> arr b -> Int -> Int -> m ()
   copyMutable :: (PrimMonad m, Element arr b) => Mutable arr (PrimState m) b -> Int -> Mutable arr (PrimState m) b -> Int -> Int -> m ()
   clone :: Element arr b => arr b -> Int -> Int -> arr b
@@ -95,6 +96,7 @@
   size = sizeofPrimArray
   sizeMutable = getSizeofMutablePrimArray
   unsafeFreeze = unsafeFreezePrimArray
+  thaw = thawPrimArray
   copy = copyPrimArray
   copyMutable = copyMutablePrimArray
   clone = clonePrimArray
@@ -138,6 +140,7 @@
   size = sizeofArray
   sizeMutable = pure . sizeofMutableArray
   unsafeFreeze = unsafeFreezeArray
+  thaw = thawArray
   copy = copyArray
   copyMutable = copyMutableArray
   clone = cloneArray
@@ -183,6 +186,7 @@
   size = sizeofUnliftedArray
   sizeMutable = pure . sizeofMutableUnliftedArray
   unsafeFreeze = unsafeFreezeUnliftedArray
+  thaw = thawUnliftedArray
   copy = copyUnliftedArray
   copyMutable = copyMutableUnliftedArray
   clone = cloneUnliftedArray
@@ -356,6 +360,13 @@
       | otherwise = return acc1
 {-# INLINABLE foldlM' #-}
 
+thawPrimArray :: (PrimMonad m, Prim a) => PrimArray a -> Int -> Int -> m (MutablePrimArray (PrimState m) a)
+thawPrimArray !arr !off !len = do
+  marr <- newPrimArray len
+  copyPrimArray marr 0 arr off len
+  return marr
+{-# INLINE thawPrimArray #-}
+
 clonePrimArray :: Prim a => PrimArray a -> Int -> Int -> PrimArray a
 clonePrimArray !arr !off !len = runST $ do
   marr <- newPrimArray len
@@ -446,10 +457,10 @@
           go (i + 1)
   go 0
 
-traverseP :: (PrimMonad m, Contiguous arr, Element arr a, Element arr b)
+traverseP :: (PrimMonad m, Contiguous arr1, Contiguous arr2, Element arr1 a, Element arr2 b)
   => (a -> m b)
-  -> arr a
-  -> m (arr b)
+  -> arr1 a
+  -> m (arr2 b)
 traverseP f = \ !ary ->
   let
     !sz = size ary
