diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+1.4.4
+
+* `readIntegralBounded`: use `metavar` in error message
+
 1.4.3
 
 * Export internal `readIntegralBounded` utility
diff --git a/optparse-generic.cabal b/optparse-generic.cabal
--- a/optparse-generic.cabal
+++ b/optparse-generic.cabal
@@ -1,5 +1,5 @@
 Name: optparse-generic
-Version: 1.4.3
+Version: 1.4.4
 Cabal-Version: >=1.10
 Build-Type: Simple
 License: BSD3
diff --git a/src/Options/Generic.hs b/src/Options/Generic.hs
--- a/src/Options/Generic.hs
+++ b/src/Options/Generic.hs
@@ -452,7 +452,7 @@
 instance ParseField ()
 instance ParseField Void
 
-readIntegralBounded :: forall a. (Integral a, Bounded a, Typeable a) => ReadM a
+readIntegralBounded :: forall a. (Integral a, Bounded a, Typeable a, ParseField a) => ReadM a
 readIntegralBounded =
     auto >>= f
     where
@@ -461,7 +461,7 @@
             | otherwise = pure $ fromInteger i
         lower = toInteger (minBound :: a)
         upper = toInteger (maxBound :: a)
-        msg = map toUpper (show (Data.Typeable.typeOf (undefined :: a))) <>
+        msg = metavar (Proxy :: Proxy a) <>
               " must be within the range [" <>
               show lower <> " .. " <> show upper <> "]"
 
