diff --git a/genvalidity-text.cabal b/genvalidity-text.cabal
--- a/genvalidity-text.cabal
+++ b/genvalidity-text.cabal
@@ -1,5 +1,5 @@
 name:                genvalidity-text
-version:             0.1.0.0
+version:             0.1.0.1
 synopsis:            GenValidity support for Text
 description:         Please see README.md
 homepage:            https://github.com/NorfairKing/validity#readme
@@ -16,10 +16,12 @@
   hs-source-dirs:      src
   exposed-modules:     Data.GenValidity.Text
   build-depends:       base       < 5
-                     , validity       
+                     , validity
+                     , validity-text
                      , genvalidity
-                     , text       
-                     , QuickCheck      
+                     , text
+                     , array
+                     , QuickCheck
   default-language:    Haskell2010
 
 test-suite genvalidity-text-test
diff --git a/src/Data/GenValidity/Text.hs b/src/Data/GenValidity/Text.hs
--- a/src/Data/GenValidity/Text.hs
+++ b/src/Data/GenValidity/Text.hs
@@ -1,34 +1,48 @@
 module Data.GenValidity.Text where
 
 import           Data.GenValidity
+import           Data.Validity.Text ()
 
 import           Test.QuickCheck
 
-import           Data.Text        (Text)
-import qualified Data.Text        as T
+import           Control.Monad
 
+import qualified Data.Text.Array    as A
+import           Data.Text.Internal (Text(..))
+import qualified Data.Text          as T
 
-genUncheckedText :: Gen Text
-genUncheckedText = sized $ \n -> do
-    size <- upTo n
-    chars <- resize size $ genListOf arbitrary
-    return $ T.pack chars
 
+instance GenValidity Text where
+    genUnchecked = Text <$> uncheckedArray <*> arbitrary <*> arbitrary
+      where
+        uncheckedArray = sized $ \n -> do
+            size <- upTo n
+            ins <- replicateM size arbitrary
+            return $ A.run $ do
+              arr <- A.new size
+              forM_ (zip [0..] ins) $ uncurry $ A.unsafeWrite arr
+              return arr
+
+    genValid = sized $ \n -> do
+        size <- upTo n
+        chars <- resize size $ genListOf arbitrary
+        return $ T.pack chars
+
 textStartingWith :: Char -> Gen Text
 textStartingWith c = sized $ \n ->
     case n of
         0 -> pure $ T.singleton c
         1 -> pure $ T.singleton c
         _ -> do
-            rest <- resize (n - 1) genUncheckedText
+            rest <- resize (n - 1) genValid
             return $ T.cons c rest
 
 textWith :: Gen Text -> Gen Text
 textWith gen = sized $ \n -> do
     (b, m, a) <- genSplit3 n
-    before <- resize b genUncheckedText
+    before <- resize b genValid
     middle <- resize m gen
-    after  <- resize a genUncheckedText
+    after  <- resize a genValid
     return $ T.concat [before, middle, after]
 
 textWithA :: Char -> Gen Text
@@ -37,11 +51,11 @@
 textWithoutAny :: Char -> Gen Text
 textWithoutAny c = textWithoutAnyOf [c]
 
-textWithoutAnyOf :: [Char] -> Gen Text
+textWithoutAnyOf :: String -> Gen Text
 textWithoutAnyOf cs = T.pack <$> genListOf (arbitrary `suchThat` (`notElem` cs))
 
 textAllCaps :: Gen Text
-textAllCaps = T.toUpper <$> genUncheckedText
+textAllCaps = T.toUpper <$> genValid
 
 
 
diff --git a/test/Data/GenValidity/TextSpec.hs b/test/Data/GenValidity/TextSpec.hs
--- a/test/Data/GenValidity/TextSpec.hs
+++ b/test/Data/GenValidity/TextSpec.hs
@@ -3,16 +3,16 @@
 import           Test.Hspec
 import           Test.QuickCheck
 
-import           Data.GenValidity      ()
+import           Data.GenValidity
 import           Data.GenValidity.Text
 
 import qualified Data.Text             as T
 
 spec :: Spec
 spec = do
-    describe "genUncheckedText" $ do
+    describe "genValid" $ do
         it "is always empty when resized to 0" $ do
-            forAll (resize 0 genUncheckedText) (`shouldSatisfy` T.null)
+            forAll (resize 0 genValid) (`shouldSatisfy` T.null)
 
     describe "textStartingWith" $ do
         it "is never empty" $ do
