diff --git a/servant-pagination.cabal b/servant-pagination.cabal
--- a/servant-pagination.cabal
+++ b/servant-pagination.cabal
@@ -10,7 +10,7 @@
     different fashions (pagination with offset / limit, endless scroll using
     last referenced resources, ascending and descending ordering, etc.)
 version:
-    2.3.0
+    2.4.0
 homepage:
     https://github.com/chordify/haskell-servant-pagination
 bug-reports:
@@ -84,8 +84,8 @@
   build-depends:
       base >= 4 && < 5
     , text >= 1.2 && < 2
-    , servant >= 0.11 && < 0.18
-    , servant-server >= 0.11 && < 0.18
+    , servant >= 0.11 && < 0.19
+    , servant-server >= 0.11 && < 0.19
     , safe >= 0.3 && < 1
     , uri-encode >= 1.5 && < 1.6
 
@@ -130,9 +130,9 @@
   build-depends:
       base >= 4 && < 5
     , aeson >= 1.2 && < 2
-    , servant >= 0.11 && < 0.18
+    , servant >= 0.11 && < 0.19
     , servant-pagination
-    , servant-server >= 0.11 && < 0.18
+    , servant-server >= 0.11 && < 0.19
     , warp >= 3.2 && < 4
 
   hs-source-dirs:
@@ -178,9 +178,9 @@
   build-depends:
       base >= 4 && < 5
     , aeson >= 1.2 && < 2
-    , servant >= 0.11 && < 0.18
+    , servant >= 0.11 && < 0.19
     , servant-pagination
-    , servant-server >= 0.11 && < 0.18
+    , servant-server >= 0.11 && < 0.19
     , warp >= 3.2 && < 4
 
   hs-source-dirs:
diff --git a/src/Servant/Pagination.hs b/src/Servant/Pagination.hs
--- a/src/Servant/Pagination.hs
+++ b/src/Servant/Pagination.hs
@@ -79,7 +79,7 @@
 --
 -- defaultRange :: 'Range' "name" 'String'
 -- defaultRange =
---   'getDefaultRange' ('Data.Proxy.Proxy' @Color)
+--   'getDefaultRange' ('Data.Proxy.Proxy' \@Color)
 --
 -- server :: 'Servant.Server.Server' API
 -- server mrange = do
@@ -90,7 +90,7 @@
 --
 -- main :: 'IO' ()
 -- main =
---   'Network.Wai.Handler.Warp.run' 1337 ('Servant.Server.serve' ('Data.Proxy.Proxy' @API) server)
+--   'Network.Wai.Handler.Warp.run' 1337 ('Servant.Server.serve' ('Data.Proxy.Proxy' \@API) server)
 -- @
 module Servant.Pagination
   (
@@ -289,7 +289,7 @@
 
           range <- Range
             <$> mapM (parseUrlPiece . decodeText) (listToMaybe value)
-            <*> ifOpt "limit"  defaultRangeLimit opts
+            <*> (ifOpt "limit"  defaultRangeLimit opts >>= checkLimit)
             <*> ifOpt "offset" defaultRangeOffset opts
             <*> ifOpt "order"  defaultRangeOrder opts
             <*> pure (Proxy @field)
@@ -312,6 +312,10 @@
       ifOpt opt def =
         maybe (pure def) (parseQueryParam . snd) . find ((== opt) . fst)
 
+      checkLimit :: Int -> Either Text Int
+      checkLimit n
+        | n < 0     = Left "Limit must be non-negative"
+        | otherwise = return n
 
 -- | Define the sorting order of the paginated resources (ascending or descending)
 data RangeOrder
@@ -418,7 +422,7 @@
 --  -> 'Servant.Server.Handler' ('Servant.Headers' ('PageHeaders' '["created_at"] Resource) [Resource])
 -- myHandler mrange =
 --  let range =
---        'Data.Maybe.fromMaybe' ('getDefaultRange' ('Data.Proxy.Proxy' @Resource)) (mrange >>= 'extractRange')
+--        'Data.Maybe.fromMaybe' ('getDefaultRange' ('Data.Proxy.Proxy' \@Resource)) (mrange >>= 'extractRange')
 --
 --  'returnRange' range ('applyRange' range resources)
 -- @
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -1,4 +1,4 @@
-resolver: lts-14.25
+resolver: lts-16.15
 
 # Generate files required by Weeder.
 # See https://github.com/ndmitchell/weeder/issues/53
