diff --git a/System/Console/CmdArgs/Implicit.hs b/System/Console/CmdArgs/Implicit.hs
--- a/System/Console/CmdArgs/Implicit.hs
+++ b/System/Console/CmdArgs/Implicit.hs
@@ -216,6 +216,13 @@
 -- > cmdArgs $ Mode {state = enum [On &= help "Turn on",Off &= help "Turn off"]}
 -- >   --on   Turn on
 -- >   --off  Turn off
+--
+--   This annotation can be used to allow multiple flags within a field:
+--
+-- > data Mode = Mode {state :: [State]}
+-- > cmdArgs $ Mode {state = enum [[] &= ignore, [On] &= help "Turn on", [Off] &= help "Turn off"]}
+--
+--   Now @--on --off@ would produce @Mode [On,Off]@.
 enum :: Data val => [val] -> val
 enum = many
 
diff --git a/System/Console/CmdArgs/Implicit/Local.hs b/System/Console/CmdArgs/Implicit/Local.hs
--- a/System/Console/CmdArgs/Implicit/Local.hs
+++ b/System/Console/CmdArgs/Implicit/Local.hs
@@ -15,6 +15,7 @@
 import System.Console.CmdArgs.Explicit
 import System.Console.CmdArgs.Annotate
 import System.Console.CmdArgs.Default
+import qualified Data.Generics.Any.Prelude as A
 
 import Control.Monad
 import Data.Char
@@ -117,13 +118,16 @@
 flag_ name (Ann a b) = map (flagAnn a) $ flag_ name b
 flag_ name (Value x) = [def{flagField=name, flagFlag = remap embed reembed $ value_ name x}]
 flag_ name x@Ctor{} = flag_ name $ Value $ fromCapture x
-flag_ name (Many xs) = map (enum_ name) xs
+flag_ name (Many xs) = concatMap (enum_ name) xs
 flag_ name x = errFlag name $ show x
 
 
-enum_ :: String -> Capture Ann -> Flag_
-enum_ name (Ann a b) = flagAnn a $ enum_ name b
-enum_ name (Value x) = def{flagField=name, flagFlag = flagNone [] (fmap $ setField (name,x)) "", flagEnum=Just $ ctor x}
+enum_ :: String -> Capture Ann -> [Flag_]
+enum_ name (Ann Ignore _) = []
+enum_ name (Ann a b) = map (flagAnn a) $ enum_ name b
+enum_ name (Value x) = [def{flagField=name, flagFlag = flagNone [] (fmap upd) "", flagEnum=Just $ ctor x}]
+    where upd v | not (A.isString x) && A.isList x = setField (name, getField name v `A.append` x) v
+                | otherwise = setField (name,x) v
 enum_ name x@Ctor{} = enum_ name $ Value $ fromCapture x
 enum_ name x = errFlag name $ show x
 
diff --git a/System/Console/CmdArgs/Test/Implicit/Tests.hs b/System/Console/CmdArgs/Test/Implicit/Tests.hs
--- a/System/Console/CmdArgs/Test/Implicit/Tests.hs
+++ b/System/Console/CmdArgs/Test/Implicit/Tests.hs
@@ -314,15 +314,25 @@
     ["test","--","@foo"] === Test17 ["test","@foo"]
 
 
+data Debuggable = This | That deriving (Eq,Show,Data,Typeable)
+data Test18 = Test18 {test18_ :: [Debuggable]} deriving (Eq,Show,Data,Typeable)
+
+mode18 = cmdArgsMode $ Test18 $ enum [[] &= ignore, [This] &= name "debug-this", [That] &= name "debug-that"]
+
+test18 = do
+    let Tester{..} = tester "Test18" mode18
+    [] === Test18 []
+    ["--debug-this","--debug-that","--debug-this"] === Test18 [This,That,This]
+
 -- For some reason, these must be at the end, otherwise the Template Haskell
 -- stage restriction kicks in.
 
 test = test1 >> test2 >> test3 >> test4 >> test5 >> test6 >> test7 >> test8 >> test9 >> test10 >>
-       test11 >> test12 >> test13 >> test14 >> test15 >> test16
+       test11 >> test12 >> test13 >> test14 >> test15 >> test16 >> test18
 demos = zipWith f [1..]
         [toDemo mode1, toDemo mode2, toDemo mode3, toDemo mode4, toDemo mode5, toDemo mode6
         ,toDemo mode7, toDemo mode8, toDemo mode9, toDemo mode10, toDemo mode11, toDemo mode12
-        ,toDemo mode13, toDemo mode14, toDemo mode15, toDemo mode16, toDemo mode17]
+        ,toDemo mode13, toDemo mode14, toDemo mode15, toDemo mode16, toDemo mode17, toDemo mode18]
     where f i x = x{modeHelp = "Testing various corner cases (" ++ show i ++ ")"}
 
 
diff --git a/cmdargs.cabal b/cmdargs.cabal
--- a/cmdargs.cabal
+++ b/cmdargs.cabal
@@ -1,7 +1,7 @@
 cabal-version:      >= 1.6
 build-type:         Simple
 name:               cmdargs
-version:            0.10.2
+version:            0.10.3
 license:            BSD3
 license-file:       LICENSE
 category:           Console
