diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,18 @@
+### 0.5
+
+#### Major changes
+
+- Changed the interface of texels transfer and filling. We dropped the `Foldable` instance and now
+  require a `Data.Vector.Storable.Vector` for performance purposes.
+
+#### Minor changes
+
+- Added `MirrorRepeat` constructor to `Wrap`.
+
+#### Patch changes
+
+- Fixed prerequisites in README.
+
 ## 0.4.1
 
 - Fixed the `sizeOf` implementatiof of `a :. b`.
diff --git a/luminance.cabal b/luminance.cabal
--- a/luminance.cabal
+++ b/luminance.cabal
@@ -1,5 +1,5 @@
 name:                luminance
-version:             0.4.1
+version:             0.5
 synopsis:            Type-safe, dependently-typed and stateless graphics framework
 description:         This package exposes several modules to work with /GPUs/ in a stateless and
                      type-safe way. Currently, it uses __OpenGL__ as backend hardware technology but
@@ -121,6 +121,7 @@
                      , resourcet      >= 1.1  && < 1.2
                      , semigroups     >= 0.16 && < 0.17
                      , transformers   >= 0.4  && < 0.5
+                     , vector         >= 0.11 && < 0.12
                      , void           >= 0.7  && < 0.8
 
   hs-source-dirs:      src
diff --git a/src/Graphics/Luminance/Core/Cubemap.hs b/src/Graphics/Luminance/Core/Cubemap.hs
--- a/src/Graphics/Luminance/Core/Cubemap.hs
+++ b/src/Graphics/Luminance/Core/Cubemap.hs
@@ -10,9 +10,8 @@
 
 module Graphics.Luminance.Core.Cubemap where
 
-import Data.Foldable ( toList )
 import Data.Proxy ( Proxy(..) )
-import Foreign.Marshal.Array ( withArray )
+import Data.Vector.Storable ( unsafeWith )
 import Foreign.Ptr ( castPtr )
 import Graphics.Luminance.Core.Texture ( BaseTexture(..), Texture(..) )
 import Graphics.Luminance.Core.Pixel ( Pixel(..) )
@@ -56,7 +55,7 @@
     glTextureStorage2D tid levels (pixelIFormat (Proxy :: Proxy f)) (fromIntegral w)
       (fromIntegral h)
   transferTexelsSub _ tid (x,y,f) (w,h) texels =
-      withArray (toList texels) $ glTextureSubImage3D tid 0 (fromIntegral x) (fromIntegral y)
+      unsafeWith texels $ glTextureSubImage3D tid 0 (fromIntegral x) (fromIntegral y)
         (fromCubeFace f) (fromIntegral w) (fromIntegral h) 1 fmt
         typ . castPtr
     where
@@ -64,7 +63,7 @@
       fmt = pixelFormat proxy
       typ = pixelType proxy
   fillTextureSub _ tid (x,y,f) (w,h) filling =
-      withArray (toList filling) $ glClearTexSubImage tid 0 (fromIntegral x) (fromIntegral y) 
+      unsafeWith filling $ glClearTexSubImage tid 0 (fromIntegral x) (fromIntegral y) 
         (fromCubeFace f) (fromIntegral w) (fromIntegral h) 1
         fmt typ . castPtr
     where
diff --git a/src/Graphics/Luminance/Core/Texture.hs b/src/Graphics/Luminance/Core/Texture.hs
--- a/src/Graphics/Luminance/Core/Texture.hs
+++ b/src/Graphics/Luminance/Core/Texture.hs
@@ -14,6 +14,7 @@
 import Control.Monad.IO.Class ( MonadIO(..) )
 import Control.Monad.Trans.Resource ( MonadResource, register )
 import Data.Proxy ( Proxy(..) )
+import Data.Vector.Storable ( Vector )
 import Foreign.Marshal.Alloc ( alloca )
 import Foreign.Marshal.Utils ( with )
 import Foreign.Storable ( Storable(peek) )
@@ -36,13 +37,15 @@
   = ClampToEdge
   -- | ClampToBorder
   | Repeat
+  | MirroredRepeat
     deriving (Eq,Show)
 
 fromWrap :: (Eq a,Num a) => Wrap -> a
 fromWrap w = case w of
-  ClampToEdge   -> GL_CLAMP_TO_EDGE
-  -- ClampToBorder -> GL_CLAMP_TO_BORDER
-  Repeat        -> GL_REPEAT
+  ClampToEdge    -> GL_CLAMP_TO_EDGE
+  -- ClampToBorder  -> GL_CLAMP_TO_BORDER
+  Repeat         -> GL_REPEAT
+  MirroredRepeat -> GL_MIRRORED_REPEAT
 
 -- |Sampling filter. 'Nearest' will sample the nearest texel at the sampling coordinates whilst
 -- 'Linear' will perform linear interpolation with the texels nearby.
@@ -100,19 +103,19 @@
                  -> GLint -- levels
                  -> TextureSize t -- size of the texture
                  -> IO ()
-  transferTexelsSub :: forall a f proxy. (Foldable f,Storable a)
+  transferTexelsSub :: (Storable a)
                     => proxy t
                     -> GLuint -- texture ID
                     -> TextureOffset t -- offset
                     -> TextureSize t -- size
-                    -> f a
+                    -> Vector a
                     -> IO ()
-  fillTextureSub :: forall a f proxy. (Foldable f,Storable a)
+  fillTextureSub :: (Storable a)
                  => proxy t
                  -> GLuint
                  -> TextureOffset t -- offset
                  -> TextureSize t -- size
-                 -> f a
+                 -> Vector a
                  -> IO ()
 
 -- OpenGL texture.
@@ -227,12 +230,12 @@
 -- |@'uploadSub' tex offset size autolvl texels@ uploads data to a subpart of the texture’s storage.
 -- The offset is given with origin at upper-left corner, and @size@ is the size of the area
 -- to upload to. @autolvl@ is a 'Bool' that can be used to automatically generate mipmaps.
-uploadSub :: forall a f m t. (Foldable f,MonadIO m,Storable a,Texture t)
+uploadSub :: forall a m t. (MonadIO m,Storable a,Texture t)
           => t
           -> TextureOffset t
           -> TextureSize t
           -> Bool
-          -> f a
+          -> Vector a
           -> m ()
 uploadSub tex offset size autolvl texels = liftIO $ do
     transferTexelsSub (Proxy :: Proxy t) tid offset size texels
@@ -241,12 +244,12 @@
     tid = baseTextureID (toBaseTexture tex)
 
 -- |Fill a subpart of the texture’s storage with a given value.
-fillSub :: forall a f m t. (Foldable f,MonadIO m,Storable a,Texture t)
+fillSub :: forall a m t. (MonadIO m,Storable a,Texture t)
         => t
         -> TextureOffset t
         -> TextureSize t
         -> Bool
-        -> f a
+        -> Vector a
         -> m ()
 fillSub tex offset size autolvl filling = liftIO $ do
     fillTextureSub (Proxy :: Proxy t) tid offset size filling
diff --git a/src/Graphics/Luminance/Core/Texture1D.hs b/src/Graphics/Luminance/Core/Texture1D.hs
--- a/src/Graphics/Luminance/Core/Texture1D.hs
+++ b/src/Graphics/Luminance/Core/Texture1D.hs
@@ -10,9 +10,8 @@
 
 module Graphics.Luminance.Core.Texture1D where
 
-import Data.Foldable ( toList )
 import Data.Proxy ( Proxy(..) )
-import Foreign.Marshal.Array ( withArray )
+import Data.Vector.Storable ( unsafeWith )
 import Foreign.Ptr ( castPtr )
 import Graphics.Luminance.Core.Texture ( BaseTexture(..), Texture(..) )
 import Graphics.Luminance.Core.Pixel ( Pixel(..) )
@@ -35,14 +34,14 @@
   textureStorage _ tid levels w =
     glTextureStorage1D tid levels (pixelIFormat (Proxy :: Proxy f)) (fromIntegral w)
   transferTexelsSub _ tid x w texels =
-      withArray (toList texels) $ glTextureSubImage1D tid 0 (fromIntegral x) (fromIntegral w) fmt
+      unsafeWith texels $ glTextureSubImage1D tid 0 (fromIntegral x) (fromIntegral w) fmt
         typ . castPtr
     where
       proxy = Proxy :: Proxy f
       fmt = pixelFormat proxy
       typ = pixelType proxy
   fillTextureSub _ tid x w filling =
-      withArray (toList filling) $ glClearTexSubImage tid 0 (fromIntegral x) 0 0 (fromIntegral w) 1 1
+      unsafeWith filling $ glClearTexSubImage tid 0 (fromIntegral x) 0 0 (fromIntegral w) 1 1
         fmt typ . castPtr
     where
       proxy = Proxy :: Proxy f
diff --git a/src/Graphics/Luminance/Core/Texture2D.hs b/src/Graphics/Luminance/Core/Texture2D.hs
--- a/src/Graphics/Luminance/Core/Texture2D.hs
+++ b/src/Graphics/Luminance/Core/Texture2D.hs
@@ -10,9 +10,8 @@
 
 module Graphics.Luminance.Core.Texture2D where
 
-import Data.Foldable ( toList )
 import Data.Proxy ( Proxy(..) )
-import Foreign.Marshal.Array ( withArray )
+import Data.Vector.Storable ( unsafeWith )
 import Foreign.Ptr ( castPtr )
 import Graphics.Luminance.Core.Texture ( BaseTexture(..), Texture(..) )
 import Graphics.Luminance.Core.Pixel ( Pixel(..) )
@@ -36,14 +35,14 @@
   textureStorage _ tid levels (w,h) =
     glTextureStorage2D tid levels (pixelIFormat (Proxy :: Proxy f)) (fromIntegral w) (fromIntegral h)
   transferTexelsSub _ tid (x,y) (w,h) texels =
-      withArray (toList texels) $ glTextureSubImage2D tid 0 (fromIntegral x) (fromIntegral y)
+      unsafeWith texels $ glTextureSubImage2D tid 0 (fromIntegral x) (fromIntegral y)
         (fromIntegral w) (fromIntegral h) fmt typ . castPtr
     where
       proxy = Proxy :: Proxy f
       fmt = pixelFormat proxy
       typ = pixelType proxy
   fillTextureSub _ tid (x,y) (w,h) filling =
-      withArray (toList filling) $ glClearTexSubImage tid 0 (fromIntegral x)
+      unsafeWith filling $ glClearTexSubImage tid 0 (fromIntegral x)
         (fromIntegral y) 0 (fromIntegral w) (fromIntegral h) 1 fmt typ . castPtr
     where
       proxy = Proxy :: Proxy f
diff --git a/src/Graphics/Luminance/Core/Texture3D.hs b/src/Graphics/Luminance/Core/Texture3D.hs
--- a/src/Graphics/Luminance/Core/Texture3D.hs
+++ b/src/Graphics/Luminance/Core/Texture3D.hs
@@ -10,9 +10,8 @@
 
 module Graphics.Luminance.Core.Texture3D where
 
-import Data.Foldable ( toList )
 import Data.Proxy ( Proxy(..) )
-import Foreign.Marshal.Array ( withArray )
+import Data.Vector.Storable ( unsafeWith )
 import Foreign.Ptr ( castPtr )
 import Graphics.Luminance.Core.Texture ( BaseTexture(..), Texture(..) )
 import Graphics.Luminance.Core.Pixel ( Pixel(..) )
@@ -38,14 +37,14 @@
     glTextureStorage3D tid levels (pixelIFormat (Proxy :: Proxy f)) (fromIntegral w)
       (fromIntegral h) (fromIntegral d)
   transferTexelsSub _ tid (x,y,z) (w,h,d) texels =
-      withArray (toList texels) $ glTextureSubImage3D tid 0 (fromIntegral x) (fromIntegral y)
+      unsafeWith texels $ glTextureSubImage3D tid 0 (fromIntegral x) (fromIntegral y)
         (fromIntegral z) (fromIntegral w) (fromIntegral h) (fromIntegral d) fmt typ . castPtr
     where
       proxy = Proxy :: Proxy f
       fmt = pixelFormat proxy
       typ = pixelType proxy
   fillTextureSub _ tid (x,y,z) (w,h,d) filling =
-      withArray (toList filling) $ glClearTexSubImage tid 0 (fromIntegral x) (fromIntegral y)
+      unsafeWith filling $ glClearTexSubImage tid 0 (fromIntegral x) (fromIntegral y)
         (fromIntegral z) (fromIntegral w) (fromIntegral h) (fromIntegral d) fmt typ . castPtr
     where
       proxy = Proxy :: Proxy f
