diff --git a/flags-applicative.cabal b/flags-applicative.cabal
--- a/flags-applicative.cabal
+++ b/flags-applicative.cabal
@@ -1,5 +1,5 @@
 name:                flags-applicative
-version:             0.0.4.3
+version:             0.0.4.4
 synopsis:            Applicative flag parsing
 description:         https://github.com/mtth/flags-applicative
 homepage:            https://github.com/mtth/flags-applicative
diff --git a/src/Flags/Applicative.hs b/src/Flags/Applicative.hs
--- a/src/Flags/Applicative.hs
+++ b/src/Flags/Applicative.hs
@@ -220,6 +220,8 @@
   | MissingFlagValue Name
   -- | A flag with a reserved name was declared.
   | ReservedFlag Name
+  -- | A nullary flag was given a value.
+  | UnexpectedFlagValue Name
   -- | At least one flag was set but unused. This can happen when optional flags are set but their
   -- branch is not selected.
   | UnexpectedFlags (NonEmpty Name)
@@ -238,6 +240,7 @@
 displayFlagError (MissingFlag name) = qualify name <> " is required but was not set"
 displayFlagError (MissingFlagValue name) = "missing value for " <> qualify name
 displayFlagError (ReservedFlag name) = qualify name <> " was declared but is reserved"
+displayFlagError (UnexpectedFlagValue name) = "unexpected value for " <> qualify name
 displayFlagError (UnexpectedFlags names) =
   "unexpected " <> (T.intercalate " " $ fmap qualify $ toList $ names)
 displayFlagError (UnknownFlag name) = "undeclared " <> qualify name
@@ -323,7 +326,9 @@
             Nothing -> if ignoreUnknown
               then second (token:) <$> go tokens
               else Left (UnknownFlag name)
-            Just (Flag Nullary _) -> insert "" tokens
+            Just (Flag Nullary _) -> if T.null pval
+              then insert "" tokens
+              else Left $ UnexpectedFlagValue name
             Just (Flag Unary _) -> case T.uncons pval of
               Nothing -> case tokens of
                 (token':tokens') -> if prefix `isPrefixOf` token'
@@ -373,7 +378,7 @@
           flags'' = foldl' (\m name -> Map.insert name (Flag Nullary "") m) flags' sswitches
         Right (action, flags'')
     (rv, unused, tokens'') <- runAction False action flags tokens'
-    case Set.minView unused of
+    case Set.minView $ Set.difference unused (sflags <> sswitches) of
       Nothing -> Right (rv, tokens'')
       Just (name, names) -> Left $ UnexpectedFlags $ name :| toList names
 
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE TypeApplications #-}
 
 import Control.Applicative ((<|>))
+import Data.Either (isLeft)
 import Data.List.NonEmpty (NonEmpty(..))
 import Flags.Applicative
 import Test.Hspec
@@ -20,6 +21,11 @@
         parser = (,) <$> textFlag "foo" "" <*> textFlag "foo" ""
         res = parseFlags parser []
       res `shouldBe` Left (DuplicateFlag "foo")
+    it "should support help" $ do
+      let
+        parser = textFlag "foo" ""
+        res = parseFlags parser ["--foo=abc", "hi", "--help"]
+      isLeft res `shouldBe` True
     it "should fail on unknown flags" $ do
       let
         parser = textFlag "foo" ""
@@ -55,3 +61,23 @@
         parser = textListFlag "," "bar" ""
         res = parseFlags parser ["--bar=a,b,c", "def"]
       res `shouldBe` Right (["a", "b", "c"], ["def"])
+    it "should swallow switches" $ do
+      let
+        parser = boolFlag "foo" ""
+        res = parseFlags parser ["--foo", "--bar", "--swallowed_switches=bar"]
+      res `shouldBe` Right (True, [])
+    it "should fail when a switch is set as a flag" $ do
+      let
+        parser = boolFlag "foo" ""
+        res = parseFlags parser ["--foo=3"]
+      res `shouldBe` Left (UnexpectedFlagValue "foo")
+    it "should swallow flags" $ do
+      let
+        parser = boolFlag "foo" ""
+        res = parseFlags parser ["--bar=2", "--swallowed_flags=bar"]
+      res `shouldBe` Right (False, [])
+    it "should fail when a flag is swallowed as a switch" $ do
+      let
+        parser = boolFlag "foo" ""
+        res = parseFlags parser ["--foo", "--bar=1", "--swallowed_switches=bar"]
+      res `shouldBe` Left (UnexpectedFlagValue "bar")
