diff --git a/Foreign/Marshal/StaticArray.hs b/Foreign/Marshal/StaticArray.hs
--- a/Foreign/Marshal/StaticArray.hs
+++ b/Foreign/Marshal/StaticArray.hs
@@ -45,10 +45,9 @@
 
 import Control.Monad
 
-import Data.Array.IArray
-import Data.Array.Unboxed    (UArray)
+import Data.Array.Base
+import Data.Array            (Array)
 import Data.Array.IO  hiding (unsafeFreeze)
-import Data.Array.Unsafe     (unsafeFreeze)
 import Data.Functor          ((<$>))
 import Data.Proxy            (Proxy(..))
 
@@ -122,9 +121,9 @@
             m <- newArray_ b :: IO ((Mutable b) (Bound d) e)
 
             let src = castPtr src'
-            forM_ (zip [0..] $ range b) $ \(o, i) -> do
-                x <- peek $ advancePtr src o
-                writeArray m i x
+            forM_ [0 .. rangeSize b - 1] $ \i -> do
+                x <- peek $ advancePtr src i
+                unsafeWrite m i x
 
             arr <- StaticArray <$> unsafeFreeze m
         return arr
@@ -133,8 +132,8 @@
         let a = toArray arr
             b = bounds a
             dst = castPtr dst'
-        forM_ (zip [0..] $ range b) $ \(o, i) ->
-            poke (advancePtr dst o) $ a ! i
+        forM_ [0 .. rangeSize b - 1] $ \i ->
+            poke (advancePtr dst i) $ unsafeAt a i
 
 
 -- | A conversion function for converting type-level naturals to
diff --git a/storable-static-array.cabal b/storable-static-array.cabal
--- a/storable-static-array.cabal
+++ b/storable-static-array.cabal
@@ -1,5 +1,5 @@
 name:                storable-static-array
-version:             0.4.0.0
+version:             0.4.0.1
 synopsis:            Statically-sized array wrappers with Storable instances
                      for FFI marshaling
 description:         Uses type-level numeric literals to wrap arrays in a type
