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.3.1.1
+version: 0.4.0.0
 cabal-version: >=1.10
 build-type: Simple
 license: MIT
@@ -22,9 +22,9 @@
         Data.GenValidity.Text
     build-depends:
         base >=4.7 && <5,
-        validity -any,
-        validity-text >= 0.1.2,
-        genvalidity -any,
+        validity >=0.4 && <0.5,
+        validity-text >=0.2 && <0.3,
+        genvalidity >=0.4 && <0.5,
         text -any,
         array -any,
         QuickCheck -any
@@ -37,7 +37,7 @@
     build-depends:
         base -any,
         hspec -any,
-        QuickCheck,
+        QuickCheck -any,
         genvalidity -any,
         genvalidity-text -any,
         genvalidity-hspec -any,
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
@@ -31,6 +31,7 @@
             off <- upTo $ max 0 (size - 1)
             let len = size - off
             pure $ Text arr off len
+    shrinkUnchecked _ = []
 
 instance GenValid Text where
     genValid =
@@ -38,6 +39,7 @@
             size <- upTo n
             chars <- resize size $ genListOf arbitrary
             return $ T.pack chars
+    shrinkValid = fmap T.pack . shrinkValid . T.unpack
 
 instance GenInvalid Text
 
@@ -71,7 +73,7 @@
 textWithoutAny c = textWithoutAnyOf [c]
 
 -- | 'textWithoutAnyOf c' generates a 'Text' value that does not contain any character in 'ls'.
-textWithoutAnyOf :: [Char] -> Gen Text
+textWithoutAnyOf :: String -> Gen Text
 textWithoutAnyOf cs = T.pack <$> genListOf (arbitrary `suchThat` (`notElem` cs))
 
 -- | 'textAllCaps' generates a 'Text' value with only upper-case characters.
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
@@ -38,7 +38,7 @@
 spec :: Spec
 spec = do
     describe "genValid" $ do
-        it "is always empty when resized to 0" $ do
+        it "is always empty when resized to 0" $
             forAll (resize 0 genValid) (`shouldSatisfy` T.null)
         it "generates valid text" $
             forAll (genValid :: Gen Text) $ \t ->
@@ -48,31 +48,31 @@
         forAll ((genUnchecked :: Gen Text) `suchThat` isValid) $ \t ->
             unless (isValid t) $ expectationFailure $ showTextDebug t
     describe "textStartingWith" $ do
-        it "is never empty" $ do
+        it "is never empty" $
             forAll arbitrary $ \c ->
                 forAll (textStartingWith c) $ \t -> t `shouldNotSatisfy` T.null
-        it "contains exactly the first character if resized to 0" $ do
+        it "contains exactly the first character if resized to 0" $
             forAll arbitrary $ \c ->
                 forAll (resize 0 $ textStartingWith c) $ \t ->
                     t `shouldBe` T.pack [c]
-        it "contains exactly the first character if resized to 1" $ do
+        it "contains exactly the first character if resized to 1" $
             forAll arbitrary $ \c ->
                 forAll (resize 0 $ textStartingWith c) $ \t ->
                     t `shouldBe` T.pack [c]
-        it "always starts with the given char" $ do
+        it "always starts with the given char" $
             forAll arbitrary $ \c ->
                 forAll (textStartingWith c) $ \t -> T.head t `shouldBe` c
-    describe "textWithA" $ do
-        it "contains the given character" $ do
-            forAll arbitrary $ \c ->
-                forAll (textWithA c) $ \t -> T.unpack t `shouldSatisfy` (elem c)
-    describe "textWithoutAny" $ do
-        it "never contains the given char" $ do
-            forAll arbitrary $ \c ->
-                forAll (textWithoutAny c) $ \t ->
-                    T.unpack t `shouldNotSatisfy` (elem c)
-    describe "textWithoutAnyOf" $ do
-        it "never contains any of the given chars" $ do
-            forAll arbitrary $ \cs ->
-                forAll (textWithoutAnyOf cs) $ \text ->
-                    T.unpack text `shouldNotSatisfy` (\t -> any (`elem` t) cs)
+    describe "textWithA" $
+        it "contains the given character" $
+        forAll arbitrary $ \c ->
+            forAll (textWithA c) $ \t -> T.unpack t `shouldSatisfy` elem c
+    describe "textWithoutAny" $
+        it "never contains the given char" $
+        forAll arbitrary $ \c ->
+            forAll (textWithoutAny c) $ \t ->
+                T.unpack t `shouldNotSatisfy` elem c
+    describe "textWithoutAnyOf" $
+        it "never contains any of the given chars" $
+        forAll arbitrary $ \cs ->
+            forAll (textWithoutAnyOf cs) $ \text ->
+                T.unpack text `shouldNotSatisfy` (\t -> any (`elem` t) cs)
