diff --git a/src/Data/Biunfoldable.hs b/src/Data/Biunfoldable.hs
--- a/src/Data/Biunfoldable.hs
+++ b/src/Data/Biunfoldable.hs
@@ -34,8 +34,7 @@
 import Data.Functor.Constant
 import Control.Monad.Trans.State
 import qualified System.Random as R
-import Test.QuickCheck.Arbitrary (Arbitrary(..))
-import Test.QuickCheck.Gen (Gen(..))
+import Test.QuickCheck (Arbitrary(..), Gen, sized, resize)
 import Data.Maybe
 
 -- | Data structures with 2 type arguments (kind @* -> * -> *@) that can be unfolded.
@@ -95,8 +94,8 @@
 
 -- | Provides a QuickCheck generator, can be used as default instance for 'Arbitrary'.
 arbitraryDefault :: (Arbitrary a, Arbitrary b, Biunfoldable t) => Gen (t a b)
-arbitraryDefault = MkGen $ \r n -> let Arb _ f = biunfold arbUnit arbUnit in 
-  fromMaybe (error "Failed to generate a value.") (f r (n + 1))
+arbitraryDefault = let Arb _ gen = biunfold arbUnit arbUnit in 
+  fromMaybe (error "Failed to generate a value.") <$> sized (\n -> resize (n + 1) gen)
 
 instance Biunfoldable Either where
   biunfold fa fb = choose 
diff --git a/src/Data/Triunfoldable.hs b/src/Data/Triunfoldable.hs
--- a/src/Data/Triunfoldable.hs
+++ b/src/Data/Triunfoldable.hs
@@ -34,8 +34,7 @@
 import Data.Functor.Constant
 import Control.Monad.Trans.State
 import qualified System.Random as R
-import Test.QuickCheck.Arbitrary (Arbitrary(..))
-import Test.QuickCheck.Gen (Gen(..))
+import Test.QuickCheck (Arbitrary(..), Gen, sized, resize)
 import Data.Maybe
 
 -- | Data structures with 3 type arguments (kind @* -> * -> * -> *@) that can be unfolded.
@@ -98,8 +97,8 @@
 
 -- | Provides a QuickCheck generator, can be used as default instance for 'Arbitrary'.
 arbitraryDefault :: (Arbitrary a, Arbitrary b, Arbitrary c, Triunfoldable t) => Gen (t a b c)
-arbitraryDefault = MkGen $ \r n -> let Arb _ f = triunfold arbUnit arbUnit arbUnit in 
-  fromMaybe (error "Failed to generate a value.") (f r (n + 1))
+arbitraryDefault = let Arb _ gen = triunfold arbUnit arbUnit arbUnit in 
+  fromMaybe (error "Failed to generate a value.") <$> sized (\n -> resize (n + 1) gen)
 
 
 curry3 :: ((a,b,c) -> d) -> a -> b -> c -> d
diff --git a/src/Data/Unfoldable.hs b/src/Data/Unfoldable.hs
--- a/src/Data/Unfoldable.hs
+++ b/src/Data/Unfoldable.hs
@@ -46,8 +46,7 @@
 import Data.Functor.Reverse
 import Control.Monad.Trans.State
 import qualified System.Random as R
-import Test.QuickCheck.Arbitrary (Arbitrary(..))
-import Test.QuickCheck.Gen (Gen(..))
+import Test.QuickCheck (Arbitrary(..), Gen, sized, resize)
 import Data.Maybe
 
 #ifdef GENERICS
@@ -181,8 +180,8 @@
 
 -- | Provides a QuickCheck generator, can be used as default instance for 'Arbitrary'.
 arbitraryDefault :: (Arbitrary a, Unfoldable t) => Gen (t a)
-arbitraryDefault = MkGen $ \r n -> let Arb _ f = unfold arbUnit in 
-  fromMaybe (error "Failed to generate a value.") (f r (n + 1))
+arbitraryDefault = let Arb _ gen = unfold arbUnit in 
+  fromMaybe (error "Failed to generate a value.") <$> sized (\n -> resize (n + 1) gen)
 
 instance Unfoldable [] where
   unfold fa = choose 
diff --git a/src/Data/Unfolder.hs b/src/Data/Unfolder.hs
--- a/src/Data/Unfolder.hs
+++ b/src/Data/Unfolder.hs
@@ -77,8 +77,7 @@
 import Control.Monad.Trans.Writer
 
 import qualified System.Random as R
-import Test.QuickCheck.Arbitrary (Arbitrary(..))
-import Test.QuickCheck.Gen (Gen(..))
+import Test.QuickCheck (Arbitrary(..), Gen, oneof, elements, sized, resize)
 
 import Data.Monoid (Monoid(..))
 import Data.Maybe (catMaybes, listToMaybe)
@@ -334,37 +333,35 @@
 
 -- | A variant of Test.QuickCheck.Gen, with failure 
 -- and a count of the number of recursive positions.
-data Arb a = Arb Int (R.StdGen -> Int -> Maybe a)
+data Arb a = Arb Int (Gen (Maybe a))
 
 instance Functor Arb where
-  fmap f (Arb i g) = Arb i $ fmap (fmap (fmap f)) g
+  fmap f (Arb i g) = Arb i $ fmap (fmap f) g
 
 instance Applicative Arb where
-  pure = Arb 0 . pure . pure . pure
-  Arb i1 ff <*> Arb i2 fx = Arb (i1 + i2) $
-    \r -> let (r1, r2) = R.split r in liftA2 (<*>) (ff r1) (fx r2)
+  pure = Arb 0 . pure . pure
+  Arb i1 ff <*> Arb i2 fx = Arb (i1 + i2) $ liftA2 (<*>) ff fx
 
 instance Alternative Arb where
-  empty = Arb 0 (\_ _ -> Nothing)
-  Arb ia fa <|> Arb ib fb = Arb ((ia + ib + 1) `div` 2) $
-    \r n -> let (r1, r2) = R.split r in flattenArb r1 [fa r2 n, fb r2 n]
+  empty = Arb 0 (pure Nothing)
+  Arb ia fa <|> Arb ib fb = Arb ((ia + ib + 1) `div` 2) $ oneof [fa, fb]
 
 -- | Limit the depth of the generated data structure by 
 -- dividing the given size by the number of recursive positions.
 instance Unfolder Arb where
-  choose ms = Arb 1 g
+  choose ms = Arb 1 $ sized g
     where
-      g _ 0 = Nothing
-      g r n = let (r1, r2) = R.split r in 
-        flattenArb r1 $ map (\(Arb i f) -> f r2 (n `div` max i 1)) ms
+      g 0 = pure Nothing
+      g n = flattenArb $ map (\(Arb i gen) -> resize (n `div` max i 1) gen) ms
 
-flattenArb :: R.StdGen -> [Maybe a] -> Maybe a
-flattenArb r ms = case catMaybes ms of
-  [] -> Nothing
-  ms' -> Just $ ms' !! fst (R.randomR (0, length ms' - 1) r)
+flattenArb :: [Gen (Maybe a)] -> Gen (Maybe a)
+flattenArb = go [] where
+  go [] [] = pure Nothing
+  go as [] = Just <$> elements as
+  go as (g:gs) = g >>= \ma -> go (maybe as (:as) ma) gs
 
 arbUnit :: Arbitrary a => Arb a
-arbUnit = Arb 0 (\r n -> Just $ unGen arbitrary r n)
+arbUnit = Arb 0 (Just <$> arbitrary)
 
 -- | Variant of 'Data.Functor.Constant' that does multiplication of the constants for @\<*>@ and addition for @\<|>@.
 newtype NumConst a x = NumConst { getNumConst :: a } deriving (Eq, Show)
diff --git a/unfoldable.cabal b/unfoldable.cabal
--- a/unfoldable.cabal
+++ b/unfoldable.cabal
@@ -1,5 +1,5 @@
 Name:                 unfoldable
-Version:              0.7.2
+Version:              0.8
 Synopsis:             Class of data structures that can be unfolded.
 Description:          Just as there's a Foldable class, there should also be an Unfoldable class. 
                       .
@@ -38,7 +38,7 @@
       base         >= 4   && < 5 
     , transformers >= 0.3 && < 0.4
     , random       >= 1.0 && < 1.1
-    , QuickCheck   >= 2.4 && < 2.8
+    , QuickCheck   >= 2.7.3 && < 2.8
 
   if impl(ghc >= 7.6)
     cpp-options:   -DGENERICS
