diff --git a/System/Console/CmdArgs/Explicit/Help.hs b/System/Console/CmdArgs/Explicit/Help.hs
--- a/System/Console/CmdArgs/Explicit/Help.hs
+++ b/System/Console/CmdArgs/Explicit/Help.hs
@@ -120,7 +120,7 @@
               [Line $ "  " ++ modeHelp x | not $ null $ modeHelp x]
         suf = space
                   ([Line "Flags:" | mixedGroup flags] ++
-                   (helpGroup helpFlag $ modeGroupFlags x)) ++
+                   helpGroup helpFlag (modeGroupFlags x)) ++
               space (map Line $ modeHelpSuffix x)
 
 
diff --git a/System/Console/CmdArgs/Explicit/Type.hs b/System/Console/CmdArgs/Explicit/Type.hs
--- a/System/Console/CmdArgs/Explicit/Type.hs
+++ b/System/Console/CmdArgs/Explicit/Type.hs
@@ -148,17 +148,17 @@
 
 -- | Check that a mode is well formed.
 checkMode :: Mode a -> Maybe String
-checkMode x =
-    (checkNames "modes" $ concatMap modeNames $ modeModes x) `mplus`
-    msum (map checkMode $ modeModes x) `mplus`
-    (checkGroup $ modeGroupModes x) `mplus`
-    (checkGroup $ modeGroupFlags x) `mplus`
-    (checkNames "flag names" $ concatMap flagNames $ modeFlags x)
+checkMode x = msum
+    [checkNames "modes" $ concatMap modeNames $ modeModes x
+    ,msum $ map checkMode $ modeModes x
+    ,checkGroup $ modeGroupModes x
+    ,checkGroup $ modeGroupFlags x
+    ,checkNames "flag names" $ concatMap flagNames $ modeFlags x]
     where
         checkGroup :: Group a -> Maybe String
-        checkGroup x =
-            (check "Empty group name" $ all (not . null . fst) $ groupNamed x) `mplus`
-            (check "Empty group contents" $ all (not . null . snd) $ groupNamed x)
+        checkGroup x = msum
+            [check "Empty group name" $ all (not . null . fst) $ groupNamed x
+            ,check "Empty group contents" $ all (not . null . snd) $ groupNamed x]
 
         checkNames :: String -> [Name] -> Maybe String
         checkNames msg xs = check "Empty names" (all (not . null) xs) `mplus` do
diff --git a/System/Console/CmdArgs/Implicit/Global.hs b/System/Console/CmdArgs/Implicit/Global.hs
--- a/System/Console/CmdArgs/Implicit/Global.hs
+++ b/System/Console/CmdArgs/Implicit/Global.hs
@@ -144,7 +144,6 @@
 ---------------------------------------------------------------------
 -- ADD EXTRA PIECES
 
-
 extraFlags :: Prog_ -> Prog_
 extraFlags p = p{progModes = map f $ progModes p}
     where f m = m{modeFlags_ = modeFlags_ m ++ map (\x -> def{flagFlag=x, flagExplicit=True, flagGroup=grp}) flags}
@@ -178,7 +177,7 @@
 assignNames :: Prog_ -> Prog_
 assignNames x = x{progModes = map f $ namesOn fromMode toMode $ progModes x}
     where
-        fromMode x = Names (modeNames $ modeMode x) [asName $ ctor $ cmdArgsValue $ modeValue $ modeMode x]
+        fromMode x = Names (modeNames $ modeMode x) [asName $ ctor $ cmdArgsValue $ modeValue $ modeMode x | not $ modeExplicit x]
         toMode xs x = x{modeMode = (modeMode x){modeNames=["["++head xs++"]" | modeDefault x] ++ xs}}
 
         fromFlagLong x = Names (flagNames $ flagFlag x) [asName $ fromMaybe (flagField x) (flagEnum x) | not $ flagExplicit x]
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
@@ -138,6 +138,7 @@
 modeAnn ModeDefault x = x{modeDefault=True}
 modeAnn (GroupName a) x = x{modeGroup=Just a}
 modeAnn Explicit x = x{modeExplicit=True}
+modeAnn (Name a) x = withMode x $ \x -> x{modeNames=a:modeNames x}
 modeAnn a x = err "mode" $ show a
 
 
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
@@ -8,10 +8,12 @@
 import System.Console.CmdArgs.Test.Implicit.Util
 
 
-test = test1 >> test2 >> test3 >> test4 >> test5 >> test6 >> test7 >> test8 >> test9 >> test10 >> test11
+test = test1 >> test2 >> test3 >> test4 >> test5 >> test6 >> test7 >> test8 >> test9 >> test10 >>
+       test11 >> test12 >> test13
 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 mode7, toDemo mode8, toDemo mode9, toDemo mode10, toDemo mode11, toDemo mode12
+        ,toDemo mode13]
     where f i x = x{modeHelp = "Testing various corner cases (" ++ show i ++ ")"}
 
 
@@ -22,7 +24,7 @@
       deriving (Show,Eq,Data,Typeable)
 
 def1 = Test1 def def def (def &= args) def def def
-mode1 = cmdArgsMode $ def1
+mode1 = cmdArgsMode def1
 
 test1 = do
     let Tester{..} = tester "Test1" mode1
@@ -72,6 +74,7 @@
     ["a","1"] === Test3 [1] ["foo"] ["a"]
     ["a","1","c"] === Test3 [1] ["c"] ["a"]
     ["a","1","c","d"] === Test3 [1] ["c"] ["a","d"]
+    invalid $ \_ -> Test3 def def (def &= help "help" &= args)
 
 
 -- from bug #222
@@ -202,3 +205,35 @@
     fails []
     ["test11a","test"] === Test11A "test"
     ["test11b","test"] === Test11B "test"
+
+
+-- #351, check you can add name annotations to modes
+data Test12 = Test12A | Test12B deriving (Eq,Show,Data,Typeable)
+
+mode12 = cmdArgsMode $ modes [Test12A &= name "check", Test12B]
+mode12_ = cmdArgsMode $ modes [Test12A &= name "check" &= explicit, Test12B]
+
+test12 = do
+    let Tester{..} = tester "Test12" mode12
+    fails []
+    ["test12a"] === Test12A
+    ["check"] === Test12A
+    ["test12b"] === Test12B
+    fails ["t"]
+    let Tester{..} = tester "Test12" mode12_
+    fails []
+    fails ["test12a"]
+    ["check"] === Test12A
+    ["test12b"] === Test12B
+    ["t"] === Test12B
+
+-- #350, check help gets attached to modes properly
+data Test13 = Test13A | Test13B deriving (Eq,Show,Data,Typeable)
+
+mode13 = cmdArgsMode_ $ modes_ [record Test13A [] += help "foo", record Test13B [] += help "bar"]
+                        += help "all"
+
+test13 = do
+    let Tester{..} = tester "Test13" mode13
+    fails []
+    ["test13a"] === Test13A
diff --git a/System/Console/CmdArgs/Text.hs b/System/Console/CmdArgs/Text.hs
--- a/System/Console/CmdArgs/Text.hs
+++ b/System/Console/CmdArgs/Text.hs
@@ -96,7 +96,7 @@
         f (Line x) = map (a++) $ wrap1 (width - length a) b
             where (a,b) = span isSpace x
 
-        f (Cols xs) = (concat $ zipWith pad ys xs ++ [z1]) : map (replicate n ' '++) zs
+        f (Cols xs) = concat (zipWith pad ys xs ++ [z1]) : map (replicate n ' '++) zs
             where ys = fromJust $ lookup (length xs) cs
                   n = sum ys + length (takeWhile isSpace $ last xs)
                   z1:zs = wrap1 (width - n) (last xs)
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.4
+version:            0.5
 license:            BSD3
 license-file:       LICENSE
 category:           Console
