diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+1.3.0
+
+* BREAKING CHANGE: Change `vector` to be a pure `Fold` (which is faster, too!)
+
 1.2.5
 
 * Add support for folding new containers: `hashSet`, `map`, and `hashMap`
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# `foldl` v1.2.5
+# `foldl` v1.3.0
 
 Use this `foldl` library when you want to compute multiple folds over a
 collection in one pass over the data without space leaks.
diff --git a/foldl.cabal b/foldl.cabal
--- a/foldl.cabal
+++ b/foldl.cabal
@@ -1,5 +1,5 @@
 Name: foldl
-Version: 1.2.5
+Version: 1.3.0
 Cabal-Version: >=1.8.0.2
 Build-Type: Simple
 License: BSD3
@@ -37,7 +37,8 @@
         hashable                    < 1.3 ,
         contravariant               < 1.5 ,
         profunctors                 < 5.3 ,
-        comonad      >= 4.0      && < 6
+        comonad      >= 4.0      && < 6   ,
+        vector-builder              < 0.4
     Exposed-Modules:
         Control.Foldl,
         Control.Foldl.ByteString,
diff --git a/src/Control/Foldl.hs b/src/Control/Foldl.hs
--- a/src/Control/Foldl.hs
+++ b/src/Control/Foldl.hs
@@ -178,6 +178,8 @@
 import qualified Data.HashSet                as HashSet
 import qualified Data.Vector.Generic         as V
 import qualified Data.Vector.Generic.Mutable as M
+import qualified VectorBuilder.Builder
+import qualified VectorBuilder.Vector
 
 {-| Efficient representation of a left fold that preserves the fold's step
     function, initial accumulator, and extraction function
@@ -896,26 +898,15 @@
     done = id
 {-# INLINABLE hashMap #-}
 
-maxChunkSize :: Int
-maxChunkSize = 8 * 1024 * 1024
-
 -- | Fold all values into a vector
-vector :: (PrimMonad m, Vector v a) => FoldM m a (v a)
-vector = FoldM step begin done
+vector :: Vector v a => Fold a (v a)
+vector = Fold step begin done
   where
-    begin = do
-        mv <- M.unsafeNew 10
-        return (Pair mv 0)
-    step (Pair mv idx) a = do
-        let len = M.length mv
-        mv' <- if idx >= len
-            then M.unsafeGrow mv (min len maxChunkSize)
-            else return mv
-        M.unsafeWrite mv' idx a
-        return (Pair mv' (idx + 1))
-    done (Pair mv idx) = do
-        v <- V.freeze mv
-        return (V.unsafeTake idx v)
+    begin = VectorBuilder.Builder.empty
+
+    step x a = x <> VectorBuilder.Builder.singleton a
+
+    done = VectorBuilder.Vector.build
 {-# INLINABLE vector #-}
 
 {- $utilities
