diff --git a/CHANGES b/CHANGES
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+0.3.20
+
+* Support QuickCheck-2.13
+* Faster ByteString `arbitrary`
+
 0.3.19
 
 * Instances for `MaybeT`
diff --git a/bench/ByteString.hs b/bench/ByteString.hs
new file mode 100644
--- /dev/null
+++ b/bench/ByteString.hs
@@ -0,0 +1,16 @@
+module Main where
+
+import qualified Data.ByteString                      as BS
+import           System.IO                            (hPutStrLn, stderr)
+import qualified Test.QuickCheck                      as QC
+import           Test.QuickCheck.Instances.ByteString ()
+import qualified Test.QuickCheck.Monadic              as QCM
+
+-- BS.pack 6.53s
+-- current: 0.07s
+main :: IO ()
+main = QC.quickCheckWith args $ QC.property $ \bsList -> QCM.monadicIO $ do
+    QCM.run $ hPutStrLn stderr (show $ sum $ map BS.length bsList)
+    QCM.assert True
+  where
+    args = QC.stdArgs { QC.maxSize = 1000 }
diff --git a/quickcheck-instances.cabal b/quickcheck-instances.cabal
--- a/quickcheck-instances.cabal
+++ b/quickcheck-instances.cabal
@@ -1,5 +1,5 @@
 Name:                quickcheck-instances
-Version:             0.3.19
+Version:             0.3.20
 
 Synopsis:            Common quickcheck instances
 Description:         QuickCheck instances.
@@ -34,8 +34,8 @@
   GHC==7.10.3,
   GHC==8.0.2,
   GHC==8.2.2,
-  GHC==8.4.3,
-  GHC==8.6.1
+  GHC==8.4.4,
+  GHC==8.6.4
 
 Source-repository head
   type:     git
@@ -66,8 +66,9 @@
                        Test.QuickCheck.Instances.Vector
   Hs-Source-Dirs:      src
   Build-depends:
-    base       >=4.5  && <4.13,
-    QuickCheck >=2.10 && <2.13,
+    base       >=4.5   && <4.13,
+    QuickCheck >=2.13  && <2.14,
+    splitmix   >=0.0.2 && <0.1,
 
     array                >=0.4.0.0 && <0.6,
     base-compat          >=0.9.3   && <0.11,
@@ -115,3 +116,13 @@
     containers,
     tagged,
     uuid-types
+
+benchmark bytestring-gen
+  type: exitcode-stdio-1.0
+  main-is: ByteString.hs
+  hs-source-dirs: bench
+  build-depends:
+    base,
+    QuickCheck,
+    quickcheck-instances,
+    bytestring
diff --git a/src/Test/QuickCheck/Instances/ByteString.hs b/src/Test/QuickCheck/Instances/ByteString.hs
--- a/src/Test/QuickCheck/Instances/ByteString.hs
+++ b/src/Test/QuickCheck/Instances/ByteString.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE BangPatterns #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 module Test.QuickCheck.Instances.ByteString () where
@@ -5,8 +6,13 @@
 import Prelude ()
 import Prelude.Compat
 
+import Data.Word (Word8)
 import Test.QuickCheck
+import Test.QuickCheck.Gen
+import Test.QuickCheck.Random (QCGen (..))
 
+import qualified System.Random.SplitMix as SM
+
 import qualified Data.ByteString as BS
 import qualified Data.ByteString.Lazy as BL
 import qualified Data.ByteString.Short as SBS
@@ -16,7 +22,19 @@
 -------------------------------------------------------------------------------
 
 instance Arbitrary BS.ByteString where
-    arbitrary = BS.pack <$> arbitrary
+    arbitrary = MkGen $ \(QCGen g0) size ->
+        if size <= 0
+        then BS.empty
+        else
+            let (i, g1) = SM.nextInt g0
+                size' = i `mod` size
+            in fst (BS.unfoldrN size' gen g1)
+      where
+        gen :: SM.SMGen -> Maybe (Word8, SM.SMGen)
+        gen !g = Just (fromIntegral w64, g')
+          where
+            ~(w64, g') = SM.nextWord64 g
+
     shrink xs = BS.pack <$> shrink (BS.unpack xs)
 
 instance CoArbitrary BS.ByteString where
@@ -27,7 +45,21 @@
 
 
 instance Arbitrary BL.ByteString where
-    arbitrary = BL.pack <$> arbitrary
+    arbitrary = MkGen $ \(QCGen g0) size ->
+        if size <= 0
+        then BL.empty
+        else
+            let (i, g1) = SM.nextInt g0
+                size' = i `mod` size
+            in BL.unfoldr gen (size', g1)
+      where
+        gen :: (Int, SM.SMGen) -> Maybe (Word8, (Int, SM.SMGen))
+        gen (!i, !g)
+            | i <= 0    = Nothing
+            | otherwise = Just (fromIntegral w64, (i - 1, g'))
+          where
+            ~(w64, g') = SM.nextWord64 g
+
     shrink xs = BL.pack <$> shrink (BL.unpack xs)
 
 instance CoArbitrary BL.ByteString where
