diff --git a/src/Capability.hs b/src/Capability.hs
index 83bee4f3d8b71ef99c20533c4d05e260b831e638..156b35c66a42ed0d5371d54d4d22fb97717ef0cb 100644
--- a/src/Capability.hs
+++ b/src/Capability.hs
@@ -68,6 +68,11 @@ showT = T.pack . show
 showBase32 :: B.ByteString -> T.Text
 showBase32 = T.toLower . B.encodeBase32Unpadded
 
+-- XXXX decimal doesn't check for overflow.  Replace it with something that
+-- does.
+natural :: Num n => Parser n
+natural = decimal
+
 instance Show Verifier where
     show Verifier{storageIndex, fingerprint, required, total, size} =
         T.unpack $
@@ -183,13 +188,11 @@ pVerifier =
         <* char ':'
         <*> pBase32 rfc3548Alphabet 256
         <* char ':'
-        -- XXXX decimal doesn't check for overflow.  Replace it with something that
-        -- does.
-        <*> decimal
+        <*> natural
         <* char ':'
-        <*> decimal
+        <*> natural
         <* char ':'
-        <*> decimal
+        <*> natural
 
 -- | A parser combinator for parsing a CHK read capability.
 pReader :: Parser Reader
@@ -202,13 +205,11 @@ pReader =
         <* char ':'
         <*> pBase32 rfc3548Alphabet 256
         <* char ':'
-        -- XXXX decimal doesn't check for overflow.  Replace it with something that
-        -- does.
-        <*> decimal
+        <*> natural
         <* char ':'
-        <*> decimal
+        <*> natural
         <* char ':'
-        <*> decimal
+        <*> natural
 
 makeReader :: AESKey128 -> B.ByteString -> Word16 -> Word16 -> Integer -> Reader
 makeReader readKey fingerprint required total size =