diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+1.3.3
+
+* Add back the old `vector` as `vectorM`
+
 1.3.2
 
 * Compatibility with `Semigroup` becoming a super-class of `Monoid`
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# `foldl` v1.3.2
+# `foldl` v1.3.3
 
 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.3.2
+Version: 1.3.3
 Cabal-Version: >=1.8.0.2
 Build-Type: Simple
 License: BSD3
diff --git a/src/Control/Foldl.hs b/src/Control/Foldl.hs
--- a/src/Control/Foldl.hs
+++ b/src/Control/Foldl.hs
@@ -104,6 +104,7 @@
     , map
     , hashMap
     , vector
+    , vectorM
 
     -- * Utilities
     -- $utilities
@@ -917,6 +918,31 @@
 
     done = VectorBuilder.Vector.build
 {-# INLINABLE vector #-}
+
+maxChunkSize :: Int
+maxChunkSize = 8 * 1024 * 1024
+
+{-| Fold all values into a vector
+
+    This is more efficient than `vector` but is impure
+-}
+vectorM :: (PrimMonad m, Vector v a) => FoldM m a (v a)
+vectorM = FoldM 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)
+{-# INLINABLE vectorM #-}
 
 {- $utilities
     'purely' and 'impurely' allow you to write folds compatible with the @foldl@
