diff --git a/library/PrimitiveExtras/Data.hs b/library/PrimitiveExtras/Data.hs
--- a/library/PrimitiveExtras/Data.hs
+++ b/library/PrimitiveExtras/Data.hs
@@ -1,6 +1,7 @@
 module PrimitiveExtras.Data
 (
-  PrimMultiArray
+  PrimMultiArray,
+  TVarArray,
 )
 where
 
diff --git a/library/PrimitiveExtras/IO.hs b/library/PrimitiveExtras/IO.hs
--- a/library/PrimitiveExtras/IO.hs
+++ b/library/PrimitiveExtras/IO.hs
@@ -6,12 +6,18 @@
 import qualified PrimitiveExtras.UnliftedArray as A
 
 
+-- * UnliftedArray
+-------------------------
+
 generateUnliftedArray :: PrimUnlifted a => Int -> (Int -> IO a) -> IO (UnliftedArray a)
 generateUnliftedArray = A.generate
 
 replicateUnliftedArray :: PrimUnlifted a => Int -> IO a -> IO (UnliftedArray a)
 replicateUnliftedArray = A.replicateIO
 
+-- * Array
+-------------------------
+
 generateArray :: Int -> (Int -> IO a) -> IO (Array a)
 generateArray size elementIO =
   do
@@ -40,6 +46,9 @@
           else unsafeFreezeArray array
       in loop 0
 
+-- * PrimArray
+-------------------------
+
 generatePrimArray :: Prim a => Int -> (Int -> IO a) -> IO (PrimArray a)
 generatePrimArray size elementIO =
   do
@@ -107,3 +116,25 @@
                 activeThreads <- readTVar semaphore
                 guard (activeThreads == 0)
 
+-- * TVarArray
+-------------------------
+
+newTVarArray :: a -> Int -> IO (TVarArray a)
+newTVarArray a size = TVarArray <$> replicateArray size (newTVarIO a)
+
+freezeTVarArrayAsPrimArray :: Prim a => TVarArray a -> IO (PrimArray a)
+freezeTVarArrayAsPrimArray (TVarArray varArray) =
+  do
+    let size = sizeofArray varArray
+    mpa <- newPrimArray size
+    forMFromZero_ size $ \ index -> do
+      var <- indexArrayM varArray index
+      value <- atomically (readTVar var)
+      writePrimArray mpa index value
+    unsafeFreezePrimArray mpa
+
+modifyTVarArrayAt :: TVarArray a -> Int -> (a -> a) -> IO ()
+modifyTVarArrayAt (TVarArray array) index fn =
+  do
+    var <- indexArrayM array index
+    atomically $ modifyTVar' var fn
diff --git a/library/PrimitiveExtras/Types.hs b/library/PrimitiveExtras/Types.hs
--- a/library/PrimitiveExtras/Types.hs
+++ b/library/PrimitiveExtras/Types.hs
@@ -5,3 +5,5 @@
 
 
 newtype PrimMultiArray a = PrimMultiArray (UnliftedArray (PrimArray a))
+
+newtype TVarArray a = TVarArray (Array (TVar a))
diff --git a/primitive-extras.cabal b/primitive-extras.cabal
--- a/primitive-extras.cabal
+++ b/primitive-extras.cabal
@@ -1,7 +1,7 @@
 name:
   primitive-extras
 version:
-  0.1.5
+  0.1.6
 category:
   Primitive
 synopsis:
