diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,14 @@
+Data-Textual
+============
+
+[![Travis](https://img.shields.io/travis/mvv/data-textual/master.svg)](https://travis-ci.org/mvv/data-textual) [![Hackage](https://img.shields.io/hackage/v/data-textual.svg)](http://hackage.haskell.org/package/data-textual)
+
+This package provides an interface for converting between data and its
+(human-friendly) textual representation.
+
+Installation
+------------
+The usual:
+
+	$ cabal install
+
diff --git a/data-textual.cabal b/data-textual.cabal
--- a/data-textual.cabal
+++ b/data-textual.cabal
@@ -1,5 +1,5 @@
 Name: data-textual
-Version: 0.3.0.2
+Version: 0.3.0.3
 Category: Data, Text
 Stability: experimental
 Synopsis: Human-friendly textual representations.
@@ -16,6 +16,12 @@
 License: BSD3
 License-File: LICENSE
 
+Extra-Source-Files:
+  README.md
+
+Tested-With: GHC==7.6.3, GHC==7.8.4, GHC==7.10.3, GHC==8.0.2, GHC==8.2.2,
+             GHC==8.4.4, GHC==8.6.5, GHC==8.8.1
+
 Cabal-Version: >= 1.10.0
 Build-Type: Simple
 
@@ -29,7 +35,7 @@
     base >= 4 && < 5,
     bytestring >= 0.10,
     text,
-    text-latin1 >= 0.3,
+    text-latin1 >= 0.3.1,
     text-printer >= 0.4,
     parsers >= 0.5
   Hs-Source-Dirs: src
@@ -54,4 +60,3 @@
   Hs-Source-Dirs: tests
   GHC-Options: -Wall
   Main-Is: Tests.hs
-
diff --git a/src/Data/Textual.hs b/src/Data/Textual.hs
--- a/src/Data/Textual.hs
+++ b/src/Data/Textual.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE UnicodeSyntax #-}
 {-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE DeriveFunctor #-}
@@ -395,8 +396,10 @@
   {-# INLINE (>>=) #-}
   (>>) = (*>)
   {-# INLINE (>>) #-}
+#if !MIN_VERSION_base(4,13,0)
   fail = PC.unexpected
   {-# INLINE fail #-}
+#endif
 
 parse ∷ Parser α → String → Parsed α
 parse p i = runParser p [] 0 i (\_  _ _ a → Parsed a)
@@ -549,4 +552,3 @@
 fromLazyUtf8As ∷ Textual α ⇒ p α → BL.ByteString → Maybe α
 fromLazyUtf8As _ = fromLazyUtf8
 {-# INLINE fromLazyUtf8As #-}
-
diff --git a/src/Data/Textual/Integral.hs b/src/Data/Textual/Integral.hs
--- a/src/Data/Textual/Integral.hs
+++ b/src/Data/Textual/Integral.hs
@@ -309,7 +309,7 @@
         go !n  = optional digit >>= \case
                    Just n1 → if n < q || (n == q && n1 <= r)
                              then go (n * radix + n1)
-                             else fail "out of bounds"
+                             else PC.unexpected "out of bounds"
                    Nothing → return n
         radix  = radixIn s
         digit  = digitIn s
@@ -343,7 +343,7 @@
         go !n  = optional digit >>= \case
                    Just d  → if n < q || (n == q && d <= r)
                              then go (n * radix + d)
-                             else fail "out of bounds"
+                             else PC.unexpected "out of bounds"
                    Nothing → return n
         radix  = radixIn s
         digit  = digitIn s
@@ -654,7 +654,7 @@
         go !n = optional digit >>= \case
                   Just d  → if n < q || (n == q && d <= r)
                             then go ((n `shiftL` digitBits) .|. d)
-                            else fail "out of bounds"
+                            else PC.unexpected "out of bounds"
                   Nothing → return n
         digitBits = digitBitsIn s
         digit     = digitIn s
@@ -730,7 +730,7 @@
         go !n = optional digit >>= \case
                   Just d  → if n < q || (n == q && d <= r)
                             then go ((n `shiftL` digitBits) .|. d)
-                            else fail "out of bounds"
+                            else PC.unexpected "out of bounds"
                   Nothing → return n
         digitBits = digitBitsIn s
         digit     = digitIn s
@@ -928,7 +928,7 @@
         go !n   = optional digit >>= \case
                     Just d  → if n > q || (n == q && d <= r)
                               then go (n * radix - d)
-                              else fail "out of bounds"
+                              else PC.unexpected "out of bounds"
                     Nothing → return n
         radix   = radixIn s
         digit   = digitIn s
@@ -964,7 +964,7 @@
         go !n   = optional digit >>= \case
                     Just d  → if n > q || (n == q && d <= r)
                               then go (n * radix - d)
-                              else fail "out of bounds"
+                              else PC.unexpected "out of bounds"
                     Nothing → return n
         radix   = radixIn s
         digit   = digitIn s
@@ -1287,7 +1287,7 @@
         go !n     = optional digit >>= \case
                       Just d1 → if n > q || (n == q && d1 <= r)
                                 then go ((n `shiftL` digitBits) + d)
-                                else fail "out of bounds"
+                                else PC.unexpected "out of bounds"
                         where !d = fromIntegral $ negate d1
                       Nothing → return n
         digitBits = digitBitsIn s
@@ -1366,7 +1366,7 @@
         go !n     = optional digit >>= \case
                       Just d1 → if n > q || (n == q && d1 <= r)
                                 then go ((n `shiftL` digitBits) + d)
-                                else fail "out of bounds"
+                                else PC.unexpected "out of bounds"
                         where !d = fromIntegral $ negate d1
                       Nothing → return n
         digitBits = digitBitsIn s
