diff --git a/opentheory-primitive.cabal b/opentheory-primitive.cabal
--- a/opentheory-primitive.cabal
+++ b/opentheory-primitive.cabal
@@ -1,5 +1,5 @@
 name: opentheory-primitive
-version: 1.5
+version: 1.6
 category: Formal Methods
 synopsis: Haskell primitives used by OpenTheory packages
 license: MIT
diff --git a/src/OpenTheory/Primitive/Natural.hs b/src/OpenTheory/Primitive/Natural.hs
--- a/src/OpenTheory/Primitive/Natural.hs
+++ b/src/OpenTheory/Primitive/Natural.hs
@@ -14,6 +14,7 @@
 where
 
 import Data.Bits
+import qualified Data.Maybe as Maybe
 import qualified Test.QuickCheck
 
 newtype Natural =
@@ -75,6 +76,12 @@
           in (Natural q, Natural r)
 
   toInteger = unNatural
+
+instance Read Natural where
+  readsPrec =
+      \p -> Maybe.mapMaybe f . readsPrec p
+    where
+      f (n,s) = if n < 0 then Nothing else Just (Natural n, s)
 
 instance Data.Bits.Bits Natural where
   x .&. y = Natural (unNatural x .&. unNatural y)
diff --git a/src/OpenTheory/Primitive/Test.hs b/src/OpenTheory/Primitive/Test.hs
--- a/src/OpenTheory/Primitive/Test.hs
+++ b/src/OpenTheory/Primitive/Test.hs
@@ -30,4 +30,7 @@
 check :: Testable prop => String -> prop -> IO ()
 check desc prop =
   do putStr desc
-     Test.QuickCheck.quickCheckWith checkArgs prop
+     res <- Test.QuickCheck.quickCheckWithResult checkArgs prop
+     case res of
+       Test.QuickCheck.Failure {} -> error "Proposition failed"
+       _ -> return ()
