diff --git a/cabal-install/src/Distribution/Client/ParseUtils.hs b/cabal-install/src/Distribution/Client/ParseUtils.hs
index 18062b7428f..96c702a2970 100644
--- a/cabal-install/src/Distribution/Client/ParseUtils.hs
+++ b/cabal-install/src/Distribution/Client/ParseUtils.hs
@@ -1,6 +1,8 @@
 {-# LANGUAGE ExistentialQuantification #-}
 {-# LANGUAGE NamedFieldPuns #-}
 {-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
 
 -----------------------------------------------------------------------------
 
@@ -53,6 +55,7 @@ import Distribution.Deprecated.ParseUtils
   ( Field (..)
   , FieldDescr (..)
   , LineNo
+  , PError (..)
   , ParseResult (..)
   , liftField
   , lineNo
@@ -292,13 +295,16 @@ parseFieldsAndSections fieldDescrs sectionDescrs fgSectionDescrs =
     setField a (F line name value) =
       case Map.lookup name fieldMap of
         Just (FieldDescr _ _ set) -> set line value a
-        Nothing -> do
-          warning $
-            "Unrecognized field '"
-              ++ name
-              ++ "' on line "
-              ++ show line
-          return a
+        Nothing ->
+          case Left <$> Map.lookup name sectionMap <|> Right <$> Map.lookup name fgSectionMap of
+            Just _ -> ParseFailed $ FieldShouldBeStanza name line
+            Nothing -> do
+              warning $
+                "Unrecognized field '"
+                  ++ name
+                  ++ "' on line "
+                  ++ show line
+              return a
     setField a (Section line name param fields) =
       case Left <$> Map.lookup name sectionMap <|> Right <$> Map.lookup name fgSectionMap of
         Just (Left (SectionDescr _ fieldDescrs' sectionDescrs' _ set sectionEmpty)) -> do
diff --git a/cabal-install/src/Distribution/Deprecated/ParseUtils.hs b/cabal-install/src/Distribution/Deprecated/ParseUtils.hs
index e1d389ac9aa..4743213fde9 100644
--- a/cabal-install/src/Distribution/Deprecated/ParseUtils.hs
+++ b/cabal-install/src/Distribution/Deprecated/ParseUtils.hs
@@ -91,6 +91,7 @@ data PError
   = AmbiguousParse String LineNo
   | NoParse String LineNo
   | TabsError LineNo
+  | FieldShouldBeStanza String LineNo
   | FromString String (Maybe LineNo)
   deriving (Eq, Show)
 
@@ -186,6 +187,10 @@ locatedErrorMsg (NoParse f n) =
   , "Parse of field '" ++ f ++ "' failed."
   )
 locatedErrorMsg (TabsError n) = (Just n, "Tab used as indentation.")
+locatedErrorMsg (FieldShouldBeStanza name lineNumber) =
+  ( Just lineNumber
+  , "'" ++ name ++ "' is a stanza, not a field. Remove the trailing ':' to parse a stanza."
+  )
 locatedErrorMsg (FromString s n) = (n, s)
 
 syntaxError :: LineNo -> String -> ParseResult a
diff --git a/cabal-testsuite/PackageTests/ProjectConfig/FieldStanzaConfusion/cabal.out b/cabal-testsuite/PackageTests/ProjectConfig/FieldStanzaConfusion/cabal.out
new file mode 100644
index 00000000000..60680b86db3
--- /dev/null
+++ b/cabal-testsuite/PackageTests/ProjectConfig/FieldStanzaConfusion/cabal.out
@@ -0,0 +1,4 @@
+# cabal build
+Error: [Cabal-7090]
+Error parsing project file <ROOT>/cabal.project:4:
+'source-repository-package' is a stanza, not a field. Remove the trailing ':' to parse a stanza.
diff --git a/cabal-testsuite/PackageTests/ProjectConfig/FieldStanzaConfusion/cabal.project b/cabal-testsuite/PackageTests/ProjectConfig/FieldStanzaConfusion/cabal.project
new file mode 100644
index 00000000000..518ac39f5fb
--- /dev/null
+++ b/cabal-testsuite/PackageTests/ProjectConfig/FieldStanzaConfusion/cabal.project
@@ -0,0 +1,6 @@
+packages: .
+
+-- This is an error; a trailing `:` is syntax for a field, not a stanza!
+source-repository-package:
+  type: git
+  location: https://github.com/haskell-hvr/Only
diff --git a/cabal-testsuite/PackageTests/ProjectConfig/FieldStanzaConfusion/cabal.test.hs b/cabal-testsuite/PackageTests/ProjectConfig/FieldStanzaConfusion/cabal.test.hs
new file mode 100644
index 00000000000..39636819157
--- /dev/null
+++ b/cabal-testsuite/PackageTests/ProjectConfig/FieldStanzaConfusion/cabal.test.hs
@@ -0,0 +1,6 @@
+import Test.Cabal.Prelude
+
+main = cabalTest $ do
+  result <- fails $ cabal' "build" []
+  assertOutputContains "Error parsing project file" result
+  assertOutputContains "'source-repository-package' is a stanza, not a field." result
diff --git a/cabal-testsuite/PackageTests/ProjectConfig/FieldStanzaConfusion/src/MyLib.hs b/cabal-testsuite/PackageTests/ProjectConfig/FieldStanzaConfusion/src/MyLib.hs
new file mode 100644
index 00000000000..e657c4403f6
--- /dev/null
+++ b/cabal-testsuite/PackageTests/ProjectConfig/FieldStanzaConfusion/src/MyLib.hs
@@ -0,0 +1,4 @@
+module MyLib (someFunc) where
+
+someFunc :: IO ()
+someFunc = putStrLn "someFunc"
diff --git a/cabal-testsuite/PackageTests/ProjectConfig/FieldStanzaConfusion/test.cabal b/cabal-testsuite/PackageTests/ProjectConfig/FieldStanzaConfusion/test.cabal
new file mode 100644
index 00000000000..86374a457c7
--- /dev/null
+++ b/cabal-testsuite/PackageTests/ProjectConfig/FieldStanzaConfusion/test.cabal
@@ -0,0 +1,13 @@
+cabal-version:   3.0
+name:            test
+version:         0.1.0.0
+license:         NONE
+author:          rbt@sent.as
+maintainer:      Rebecca Turner
+build-type:      Simple
+
+library
+    exposed-modules:  MyLib
+    build-depends:    base
+    hs-source-dirs:   src
+    default-language: Haskell2010
diff --git a/changelog.d/pr-10525 b/changelog.d/pr-10525
new file mode 100644
index 00000000000..7235d0bec74
--- /dev/null
+++ b/changelog.d/pr-10525
@@ -0,0 +1,34 @@
+---
+synopsis: "A trailing colon after a stanza name in `cabal.project` is now an error"
+packages: [cabal-install]
+prs: 10525
+---
+
+It is now a hard error to use a trailing colon after a stanza name in
+`cabal.project` or `*.cabal` files:
+
+```
+packages: .
+
+source-repository-package:
+    type: git
+    location: https://github.com/haskell/cabal
+    tag: f34aba976a60940295f41b6649674e9568893894
+```
+
+```
+$ cabal build
+Error parsing project file cabal.project:3:
+'source-repository-package' is a stanza, not a field. Remove the trailing ':' to parse a stanza.
+```
+
+Previously, the warning message was easily ignored and somewhat misleading, as
+the difference between a stanza and a field is not immediately obvious to
+Haskellers used to config languages like JSON and YAML (which don't distinguish
+between fields which have string or list values and stanzas which have nested
+fields):
+
+```
+Warning: cabal.project: Unrecognized field
+'source-repository-package' on line 3
+```