diff --git a/genvalidity-containers.cabal b/genvalidity-containers.cabal
--- a/genvalidity-containers.cabal
+++ b/genvalidity-containers.cabal
@@ -1,5 +1,5 @@
 name:                genvalidity-containers
-version:             0.1.0.0
+version:             0.1.0.1
 synopsis:            GenValidity support for containers
 description:         Please see README.md
 homepage:            https://github.com/NorfairKing/validity#readme
diff --git a/src/Data/GenValidity/Tree.hs b/src/Data/GenValidity/Tree.hs
--- a/src/Data/GenValidity/Tree.hs
+++ b/src/Data/GenValidity/Tree.hs
@@ -13,21 +13,22 @@
 
     -- | There should be at least one invalid element, either it's here or it's
     -- further down the tree.
-    genInvalid   = oneof
-        [ Node <$> genInvalid   <*> genUnchecked
-        , Node <$> genUnchecked <*> genInvalid
-        ]
+    genInvalid   = sized $ \n -> do
+        size   <- upTo n
+        (a, b) <- genSplit size
+        oneof
+            [ Node <$> resize a genInvalid   <*> resize b genUnchecked
+            , Node <$> resize a genUnchecked <*> resize b genInvalid
+            ]
 
 -- | Generate a tree of values that are generated as specified.
 --
 -- This takes the size parameter much better into account
 genTreeOf :: Gen a -> Gen (Tree a)
-genTreeOf func = sized $ \n -> -- Sized is the size of the trees.
-    case n of
-        0 -> Node <$> func <*> pure []
-        1 -> Node <$> func <*> pure []
-        m -> do
-            value <- func
-            forest <- resize (m - 1) $ genListOf $ genTreeOf func
-            return $ Node value forest
+genTreeOf func = sized $ \n -> do
+    size   <- upTo n
+    (a, b) <- genSplit size
+    value  <- resize a func
+    forest <- resize b $ genListOf $ genTreeOf func
+    return $ Node value forest
 
