diff --git a/genvalidity-bytestring.cabal b/genvalidity-bytestring.cabal
--- a/genvalidity-bytestring.cabal
+++ b/genvalidity-bytestring.cabal
@@ -1,11 +1,13 @@
--- This file has been generated from package.yaml by hpack version 0.28.2.
+cabal-version: >= 1.10
+
+-- This file has been generated from package.yaml by hpack version 0.29.6.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: bae4cdab53a618ad6823044913df2dcea8f67ce3356ac37fa1814bb673dd289f
+-- hash: b00e12f8384f62c8e948f3eb83a4b6a8da6ff010b7a31c7b0a17362fa6e4b6fd
 
 name:           genvalidity-bytestring
-version:        0.2.0.2
+version:        0.3.0.0
 synopsis:       GenValidity support for ByteString
 description:    Please see README.md
 category:       Testing
@@ -18,13 +20,16 @@
 license:        MIT
 license-file:   LICENSE
 build-type:     Simple
-cabal-version:  >= 1.10
 
 source-repository head
   type: git
   location: https://github.com/NorfairKing/validity
 
 library
+  exposed-modules:
+      Data.GenValidity.ByteString
+  other-modules:
+      Paths_genvalidity_bytestring
   hs-source-dirs:
       src
   build-depends:
@@ -33,16 +38,15 @@
     , bytestring
     , genvalidity >=0.5
     , validity >=0.5
-    , validity-bytestring >=0.3
-  exposed-modules:
-      Data.GenValidity.ByteString
-  other-modules:
-      Paths_genvalidity_bytestring
+    , validity-bytestring >=0.4
   default-language: Haskell2010
 
 test-suite genvalidity-bytestring-test
   type: exitcode-stdio-1.0
   main-is: Spec.hs
+  other-modules:
+      Data.GenValidity.ByteStringSpec
+      Paths_genvalidity_bytestring
   hs-source-dirs:
       test
   ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall -fno-warn-name-shadowing
@@ -50,11 +54,9 @@
       QuickCheck
     , base
     , bytestring
+    , deepseq
     , genvalidity
     , genvalidity-bytestring
     , genvalidity-hspec
     , hspec
-  other-modules:
-      Data.GenValidity.ByteStringSpec
-      Paths_genvalidity_bytestring
   default-language: Haskell2010
diff --git a/src/Data/GenValidity/ByteString.hs b/src/Data/GenValidity/ByteString.hs
--- a/src/Data/GenValidity/ByteString.hs
+++ b/src/Data/GenValidity/ByteString.hs
@@ -5,16 +5,51 @@
 
 import Data.GenValidity
 import Data.Validity.ByteString ()
+import Test.QuickCheck
 #if !MIN_VERSION_base(4,8,0)
+import Control.Applicative ((<*>), pure)
 import Data.Functor ((<$>))
 #endif
 import qualified Data.ByteString as SB
-import Data.ByteString (ByteString)
+import qualified Data.ByteString.Internal as SB
+import qualified Data.ByteString.Lazy as LB
+import qualified Data.ByteString.Lazy.Internal as LB
 
-instance GenUnchecked ByteString where
-    genUnchecked = SB.pack <$> genUnchecked
-    shrinkUnchecked = fmap SB.pack . shrinkUnchecked . SB.unpack
+-- | WARNING: Unchecked ByteStrings are *seriously* broken.
+-- The pointer may still point to something which is fine, but
+-- the offset and length will most likely be complete nonsense.
+-- This will most-likely lead to segfaults.
+instance GenUnchecked SB.ByteString where
+    genUnchecked = do
+        ws <- genUnchecked
+        -- TODO what do we do about the foreign pointer?
+        let SB.PS p _ _ = SB.pack ws
+        SB.PS p <$> genUnchecked <*> genUnchecked
+    shrinkUnchecked (SB.PS p o l) =
+        [SB.PS p o' l' | (o', l') <- shrinkUnchecked (o, l)]
 
-instance GenValid ByteString
+instance GenValid SB.ByteString where
+    genValid = SB.pack <$> genValid
+    shrinkValid = fmap SB.pack . shrinkValid . SB.unpack
 
-instance GenInvalid ByteString
+instance GenInvalid SB.ByteString
+
+instance GenUnchecked LB.ByteString where
+    genUnchecked =
+        sized $ \n ->
+            case n of
+                0 -> pure LB.Empty
+                _ -> do
+                    (a, b) <- genSplit n
+                    sb <- resize a genUnchecked
+                    lb <- resize b genUnchecked
+                    pure $ LB.Chunk sb lb
+    shrinkUnchecked LB.Empty = []
+    shrinkUnchecked (LB.Chunk sb lb) =
+        LB.Empty : [LB.Chunk sb' lb' | (sb', lb') <- shrinkUnchecked (sb, lb)]
+
+instance GenValid LB.ByteString where
+    genValid = LB.pack <$> genValid
+    shrinkValid = fmap LB.pack . shrinkValid . LB.unpack
+
+instance GenInvalid LB.ByteString
diff --git a/test/Data/GenValidity/ByteStringSpec.hs b/test/Data/GenValidity/ByteStringSpec.hs
--- a/test/Data/GenValidity/ByteStringSpec.hs
+++ b/test/Data/GenValidity/ByteStringSpec.hs
@@ -2,19 +2,55 @@
     ( spec
     ) where
 
+import Control.DeepSeq
+
 import Test.Hspec
 import Test.QuickCheck
 
 import Data.GenValidity
 import Data.GenValidity.ByteString ()
 
-import Data.ByteString (ByteString)
+import qualified Data.ByteString as SB (ByteString)
+import qualified Data.ByteString.Lazy as LB (ByteString)
 
+checkable :: (Validity t, Show t, NFData t) => Gen t -> SpecWith ()
+checkable gen =
+    it "generates bytestrings that can be checked for validity" $
+    forAll gen $ \v ->
+        case prettyValidation v of
+            Left e -> deepseq e True
+            Right v_ -> deepseq v_ True
+
+showable :: Show t => Gen t -> SpecWith ()
+showable gen =
+    it "generates bytestrings that can be shown" $
+    forAll gen $ \v -> deepseq (show v) True
+
 spec :: Spec
 spec = do
-    describe "genValid" $
-        it "generates valid bytestring" $
-        forAll (genValid :: Gen ByteString) isValid
-    describe "genUnchecked `suchThat` isValid" $
-        it "generates valid bytestring" $
-        forAll ((genUnchecked :: Gen ByteString) `suchThat` isValid) isValid
+    describe "genUnchecked :: Gen SB.ByteString" $ do
+        checkable (genUnchecked :: Gen SB.ByteString)
+        -- showable (genUnchecked :: Gen SB.ByteString) DOES NOT HOLD
+    describe "genValid :: Gen SB.ByteString" $ do
+        checkable (genValid :: Gen SB.ByteString)
+        showable (genValid :: Gen SB.ByteString)
+        it "generates valid strict bytestring" $
+            forAll (genValid :: Gen SB.ByteString) isValid
+    describe "genInvalid :: Gen SB.ByteString" $ do
+        checkable (genInvalid :: Gen SB.ByteString)
+        -- showable (genInvalid :: Gen SB.ByteString) DOES NOT HOLD
+        it "generates invalid strict bytestring" $
+            forAll (genInvalid :: Gen SB.ByteString) isInvalid
+    describe "genUnchecked :: Gen LB.ByteString" $ do
+        checkable (genUnchecked :: Gen LB.ByteString)
+        -- showable (genUnchecked :: Gen LB.ByteString) DOES NOT HOLD
+    describe "genValid :: Gen LB.ByteString" $ do
+        checkable (genValid :: Gen LB.ByteString)
+        showable (genValid :: Gen LB.ByteString)
+        it "generates valid lazy bytestring" $
+            forAll (genValid :: Gen LB.ByteString) isValid
+    describe "genInvalid :: Gen LB.ByteString" $ do
+        checkable (genInvalid :: Gen LB.ByteString)
+        -- showable (genInvalid :: Gen LB.ByteString) DOES NOT HOLD
+        it "generates invalid lazy bytestring" $
+            forAll (genInvalid :: Gen LB.ByteString) isInvalid
