diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Changelog
 
+## [0.22.0.0] - 2025-09-28
+
+### Changed
+
+* Fail on an empty test suite.
+
 ## [0.21.0.0] - 2025-05-09
 
 This is technically a breaking change, but if you are not using the sydtest
diff --git a/src/Test/Syd/Output.hs b/src/Test/Syd/Output.hs
--- a/src/Test/Syd/Output.hs
+++ b/src/Test/Syd/Output.hs
@@ -70,7 +70,7 @@
 
 outputFailuresWithHeading :: Settings -> ResultForest -> [[Chunk]]
 outputFailuresWithHeading settings rf =
-  if shouldExitFail settings rf
+  if anyFailedTests settings rf
     then
       concat
         [ outputFailuresHeader,
@@ -93,7 +93,11 @@
               | testSuiteStatExamples /= testSuiteStatSuccesses
             ],
             [ [ chunk "Passed:                       ",
-                fore green $ chunk (T.pack (show testSuiteStatSuccesses))
+                ( if testSuiteStatSuccesses <= 0
+                    then fore red
+                    else fore green
+                )
+                  $ chunk (T.pack (show testSuiteStatSuccesses))
               ],
               [ chunk "Failed:                       ",
                 ( if testSuiteStatFailures > 0
diff --git a/src/Test/Syd/SpecDef.hs b/src/Test/Syd/SpecDef.hs
--- a/src/Test/Syd/SpecDef.hs
+++ b/src/Test/Syd/SpecDef.hs
@@ -403,7 +403,22 @@
       }
 
 shouldExitFail :: Settings -> ResultForest -> Bool
-shouldExitFail settings = any (any (testRunReportFailed settings . timedValue . testDefVal))
+shouldExitFail settings resultForest =
+  -- Fail if there were no tests.
+  --
+  -- This is technically valid but in practice we don't ever want to
+  -- consider an empty test suite succesfull.
+  --
+  -- By considering an empty test suite unsuccesful, we can catch cases in
+  -- which we have accidentally used a filter that does not match any
+  -- tests at all.
+  null resultForest
+    -- ... or if any tests failed.
+    || anyFailedTests settings resultForest
+
+anyFailedTests :: Settings -> ResultForest -> Bool
+anyFailedTests settings resultForest =
+  any (any (testRunReportFailed settings . timedValue . testDefVal)) resultForest
 
 data TestRunReport = TestRunReport
   { testRunReportExpectationMode :: !ExpectationMode,
diff --git a/sydtest.cabal b/sydtest.cabal
--- a/sydtest.cabal
+++ b/sydtest.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           sydtest
-version:        0.21.0.0
+version:        0.22.0.0
 synopsis:       A modern testing framework for Haskell with good defaults and advanced testing features.
 description:    A modern testing framework for Haskell with good defaults and advanced testing features. Sydtest aims to make the common easy and the hard possible. See https://github.com/NorfairKing/sydtest#readme for more information.
 category:       Testing
