diff --git a/src/Data/Validity/Text.hs b/src/Data/Validity/Text.hs
--- a/src/Data/Validity/Text.hs
+++ b/src/Data/Validity/Text.hs
@@ -2,25 +2,33 @@
 
 module Data.Validity.Text where
 
+import Control.Exception (evaluate, try)
+
 import Data.Validity
 
+import qualified Data.ByteString.Builder as SBB
+import qualified Data.ByteString.Lazy as LB
+import Data.Text ()
 import qualified Data.Text.Array as A
+import qualified Data.Text.Encoding as E
+import qualified Data.Text.Encoding.Error as E
 import Data.Text.Internal (Text(..))
-import qualified Data.Text.Internal.Encoding.Utf16 as E
+import qualified Data.Text.Unsafe as U
 
 -- | A text is valid if the internal structure is consistent.
 instance Validity Text where
-    isValid (Text arr off len) =
-        let c = A.unsafeIndex arr off
-        in and
-               [ len >= 0
-               , off >= 0
-               , len == 0 || c < 0xDC00 || c > 0xDFFF
-               , let ws = A.toList arr off len -- Checking for failures while decoding the UTFX
-                 in all E.validate1 ws && all (uncurry E.validate2) (tupsOf ws)
-               ]
-      where
-        tupsOf :: [a] -> [(a, a)]
-        tupsOf [] = []
-        tupsOf [_] = []
-        tupsOf (a:b:rs) = (a, b) : tupsOf rs
+    isValid t@(Text arr off len) =
+        and
+            [ len >= 0
+            , off >= 0
+            , let c = A.unsafeIndex arr off
+              in len == 0 || c < 0xDC00 || c > 0xDFFF
+                 -- It contains a valid UTF16
+            , (== (Right t :: Either E.UnicodeException Text)) $
+              U.unsafeDupablePerformIO .
+              try .
+              evaluate .
+              E.decodeUtf16LEWith E.strictDecode .
+              LB.toStrict . SBB.toLazyByteString . mconcat . map SBB.word16LE $
+              A.toList arr off len
+            ]
diff --git a/validity-text.cabal b/validity-text.cabal
--- a/validity-text.cabal
+++ b/validity-text.cabal
@@ -1,5 +1,5 @@
 name: validity-text
-version: 0.1.1.0
+version: 0.1.2.0
 cabal-version: >=1.10
 build-type: Simple
 license: MIT
@@ -23,7 +23,8 @@
     build-depends:
         base <5,
         validity -any,
-        text -any
+        text -any,
+        bytestring -any
     default-language: Haskell2010
     hs-source-dirs: src
 
