diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,11 @@
 and this project adheres to the
 [Haskell Package Versioning Policy](https://pvp.haskell.org/).
 
+## 0.1.1 - 2023-12-07
+
+* `...:` and `...:?` no longer smother `fail` messages if a single key is
+  present in the object.
+
 ## 0.1.0 - 2023-07-08
 
 * Spin out module `Pantry.Internal.AesonExtended` from package `pantry-0.8.3`.
diff --git a/aeson-warning-parser.cabal b/aeson-warning-parser.cabal
--- a/aeson-warning-parser.cabal
+++ b/aeson-warning-parser.cabal
@@ -1,46 +1,46 @@
 cabal-version: 1.12
-
--- This file has been generated from package.yaml by hpack version 0.35.2.
---
--- see: https://github.com/sol/hpack
-
-name:           aeson-warning-parser
-version:        0.1.0
-synopsis:       Library providing JSON parser that warns about unexpected fields in objects.
-description:    Please see the README on GitHub at <https://github.com/commercialhaskell/aeson-warning-parser#readme>
-category:       JSON
-homepage:       https://github.com/commercialhaskell/aeson-warning-parser#readme
-bug-reports:    https://github.com/commercialhaskell/aeson-warning-parser/issues
-author:         Michael Snoyman
-maintainer:     Mike Pilgrem <public@pilgrem.com>
-copyright:      2018-2023 FP Complete
-license:        BSD3
-license-file:   LICENSE
-build-type:     Simple
-extra-source-files:
-    README.md
-    CHANGELOG.md
-
-source-repository head
-  type: git
-  location: https://github.com/commercialhaskell/aeson-warning-parser
-
-library
-  exposed-modules:
-      Data.Aeson.WarningParser
-  other-modules:
-      Paths_aeson_warning_parser
-  hs-source-dirs:
-      src
-  ghc-options: -Wall
-  build-depends:
-      aeson
-    , base >=4.12 && <5
-    , containers
-    , generic-deriving
-    , rio
-    , rio-prettyprint
-    , text
-    , transformers
-    , unordered-containers
-  default-language: Haskell2010
+
+-- This file has been generated from package.yaml by hpack version 0.36.0.
+--
+-- see: https://github.com/sol/hpack
+
+name:           aeson-warning-parser
+version:        0.1.1
+synopsis:       Library providing JSON parser that warns about unexpected fields in objects.
+description:    Please see the README on GitHub at <https://github.com/commercialhaskell/aeson-warning-parser#readme>
+category:       JSON
+homepage:       https://github.com/commercialhaskell/aeson-warning-parser#readme
+bug-reports:    https://github.com/commercialhaskell/aeson-warning-parser/issues
+author:         Michael Snoyman
+maintainer:     Mike Pilgrem <public@pilgrem.com>
+copyright:      2018-2023 FP Complete
+license:        BSD3
+license-file:   LICENSE
+build-type:     Simple
+extra-source-files:
+    README.md
+    CHANGELOG.md
+
+source-repository head
+  type: git
+  location: https://github.com/commercialhaskell/aeson-warning-parser
+
+library
+  exposed-modules:
+      Data.Aeson.WarningParser
+  other-modules:
+      Paths_aeson_warning_parser
+  hs-source-dirs:
+      src
+  ghc-options: -Wall
+  build-depends:
+      aeson
+    , base >=4.12 && <5
+    , containers
+    , generic-deriving
+    , rio
+    , rio-prettyprint
+    , text
+    , transformers
+    , unordered-containers
+  default-language: Haskell2010
diff --git a/src/Data/Aeson/WarningParser.hs b/src/Data/Aeson/WarningParser.hs
--- a/src/Data/Aeson/WarningParser.hs
+++ b/src/Data/Aeson/WarningParser.hs
@@ -94,39 +94,39 @@
     a <- fmap snd p
     fmap (, a) (fmap fst p .!= d)
 
-presentCount :: Object -> [Text] -> Int
-presentCount o = length . filter (\x -> HashMap.member (textToKey x) o)
+present :: Object -> [Text] -> [Text]
+present o = filter (\x -> HashMap.member (textToKey x) o)
 
 -- | Synonym version of @..:@.
 (...:) :: FromJSON a => Object -> [Text] -> WarningParser a
 _ ...: [] = fail "failed to find an empty key"
 o ...: ss@(key:_) = apply
  where
-  pc = presentCount o ss
-  apply | pc == 0   = fail $
-                        "failed to parse field " ++
-                        show key ++ ": " ++
-                        "keys " ++ show ss ++ " not present"
-        | pc >  1   = fail $
-                        "failed to parse field " ++
-                        show key ++ ": " ++
-                        "two or more synonym keys " ++
-                        show ss ++ " present"
-        | otherwise = asum $ map (o..:) ss
+  apply = case present o ss of
+    [] -> fail $
+      "failed to parse field " ++
+      show key ++ ": " ++
+      "keys " ++ show ss ++ " not present"
+    [s] -> o ..: s
+    _ -> fail $
+      "failed to parse field " ++
+      show key ++ ": " ++
+      "two or more synonym keys " ++
+      show ss ++ " present"
 
 -- | Synonym version of @..:?@.
 (...:?) :: FromJSON a => Object -> [Text] -> WarningParser (Maybe a)
 _ ...:? [] = fail "failed to find an empty key"
 o ...:? ss@(key:_) = apply
  where
-  pc = presentCount o ss
-  apply | pc == 0   = pure Nothing
-        | pc >  1   = fail $
-                        "failed to parse field " ++
-                        show key ++ ": " ++
-                        "two or more synonym keys " ++
-                        show ss ++ " present"
-        | otherwise = asum $ map (o..:) ss
+  apply = case present o ss of
+    [] -> pure Nothing
+    [s] -> o ..: s
+    _ -> fail $
+      "failed to parse field " ++
+      show key ++ ": " ++
+      "two or more synonym keys " ++
+      show ss ++ " present"
 
 -- | Tell the warning parser about an expected field, so it doesn't warn about
 -- it.
