diff --git a/Data/Vector/Binary.hs b/Data/Vector/Binary.hs
--- a/Data/Vector/Binary.hs
+++ b/Data/Vector/Binary.hs
@@ -45,10 +45,12 @@
 import Data.Binary
 
 import qualified Data.Vector.Generic   as G
+import qualified Data.Vector.Generic.Mutable as GM
 import qualified Data.Vector.Unboxed   as U
 import qualified Data.Vector.Storable  as S
 import qualified Data.Vector.Primitive as P
 import Data.Vector (Vector)
+import System.IO.Unsafe
 
 import Foreign.Storable (Storable)
 
@@ -87,8 +89,14 @@
     -> Get (v a)
 {-# INLINE genericGetVectorWith #-}
 genericGetVectorWith getN getA = do
-    n  <- getN
-    G.replicateM n getA
+    n <- getN
+    v <- return $ unsafePerformIO $ GM.unsafeNew n
+    let go 0 = return ()
+        go i = do x <- getA
+                  () <- return $ unsafePerformIO $ GM.unsafeWrite v (i-1) x
+                  go (i-1)
+    () <- go n
+    return $ unsafePerformIO $ G.unsafeFreeze v
 
 -- | Generic put for anything in the G.Vector class which uses custom
 --   encoders.
diff --git a/benchmarks/Benchmarks.hs b/benchmarks/Benchmarks.hs
--- a/benchmarks/Benchmarks.hs
+++ b/benchmarks/Benchmarks.hs
@@ -1,33 +1,62 @@
 import Criterion.Main
 import Data.Binary
+import Data.Binary.Get
 
 import qualified Data.ByteString.Lazy     as BS
 import qualified Data.Vector.Unboxed as U
 import Data.Vector.Binary
 
 
-vec1,vec2,vec3 :: U.Vector Int
+vec1,vec2,vec3,vec4,vec5 :: U.Vector Int
 vec1 = U.enumFromN 0 3
 vec2 = U.enumFromN 0 30
 vec3 = U.enumFromN 0 300
+vec4 = U.enumFromN 0 30000
+vec5 = U.enumFromN 0 300000
 
-bs1,bs2,bs3 :: BS.ByteString
+bs1,bs2,bs3,bs4,bs5 :: BS.ByteString
 bs1 = encode vec1
 bs2 = encode vec2
 bs3 = encode vec3
+bs4 = encode vec4
+bs5 = encode vec5
 
+naiveGet :: (Binary a, U.Unbox a) => Get (U.Vector a)
+naiveGet = do
+    n <- get
+    U.replicateM n get
+
+naiveGet' :: (Binary a, U.Unbox a) => Get (U.Vector a)
+naiveGet' = do
+    n <- get
+    U.replicateM n get
+-- A feeble attempt at simulating what will happen if we end up with a situation
+-- where we are unable to specialize to the element type
+{-# NOINLINE naiveGet' #-}
+
 type V = BS.ByteString -> U.Vector Int
 
+benchGetSize :: String -> BS.ByteString -> Benchmark
+benchGetSize name bs = bgroup name
+    [ bench "U.Vector Int"                 $ nf (decode :: V) bs
+    , bench "naive U.Vector Int"           $ nf (runGet naiveGet :: V) bs
+    , bench "noinline naive U.Vector Int"  $ nf (runGet naiveGet' :: V) bs
+    ]
+
 main = defaultMain
   [ bgroup "encode"
-    [ bench "U.Vector Int 3"   $ nf encode vec1
-    , bench "U.Vector Int 30"  $ nf encode vec2
-    , bench "U.Vector Int 300" $ nf encode vec3
+    [ bench "U.Vector Int 3"      $ nf encode vec1
+    , bench "U.Vector Int 30"     $ nf encode vec2
+    , bench "U.Vector Int 300"    $ nf encode vec3
+    , bench "U.Vector Int 30000"  $ nf encode vec4
+    , bench "U.Vector Int 300000" $ nf encode vec5
     ]
   , bgroup "decode"
-    [ bench "U.Vector Int 3"   $ nf (decode :: V) bs1
-    , bench "U.Vector Int 30"  $ nf (decode :: V) bs2
-    , bench "U.Vector Int 300" $ nf (decode :: V) bs3
+    [ benchGetSize "size=3" bs1
+    , benchGetSize "size=30" bs2
+    , benchGetSize "size=300" bs3
+    , benchGetSize "size=30000" bs4
+    , benchGetSize "size=300000" bs5
     ]
   ]
 
diff --git a/vector-binary-instances.cabal b/vector-binary-instances.cabal
--- a/vector-binary-instances.cabal
+++ b/vector-binary-instances.cabal
@@ -1,5 +1,5 @@
 Name:                vector-binary-instances
-Version:             0.2.2.0
+Version:             0.2.3.0
 Synopsis:            Instances of Data.Binary and Data.Serialize for vector
 Description:
    Instances for Binary for the types defined in the vector package,
