diff --git a/System/FilePath/GlobPattern.hs b/System/FilePath/GlobPattern.hs
--- a/System/FilePath/GlobPattern.hs
+++ b/System/FilePath/GlobPattern.hs
@@ -15,6 +15,7 @@
     ) where
 
 import Control.Arrow (second)
+import Control.Monad (msum)
 import Data.Ix (Ix, inRange)
 import Data.List (nub)
 import Data.Maybe (isJust)
@@ -117,8 +118,9 @@
 simplifyTerms (MatchGroup []:as) = simplifyTerms as
 simplifyTerms (MatchGroup gs:as) =
     case commonPrefix gs of
-    (p,[]) -> simplifyTerms (MatchLiteral p : as)
-    (p,ss) -> simplifyTerms (MatchLiteral p : MatchGroup ss : as)
+    (p ,[]) -> simplifyTerms (MatchLiteral p : as)
+    ("",ss) -> MatchGroup ss : simplifyTerms as
+    (p ,ss) -> simplifyTerms (MatchLiteral p : MatchGroup ss : as)
 simplifyTerms (a:as) = a:simplifyTerms as
 
 commonPrefix :: [String] -> (String, [String])
@@ -143,11 +145,8 @@
     where matchClass (b:bs) | (inClass && k) || not (inClass || k) = return bs
                             where inClass = b `inSRange` c
           matchClass _ = fail "no match"
-matchTerms (MatchGroup g:ts) cs = matchGroup g cs >>= matchTerms ts
-    where matchGroup g' as | any null g' = return as
-          matchGroup g' (a:as) | a `elem` map head g' =
-                                   matchGroup (map tail g') as
-          matchGroup _ _ = fail "not in group"
+matchTerms (MatchGroup g:ts) cs = msum (map matchGroup g)
+    where matchGroup g = matchTerms (MatchLiteral g : ts) cs
 matchTerms [MatchAny] _ = return ()
 matchTerms (MatchAny:ts) cs = matchAny cs >>= matchTerms ts
     where matchAny [] = fail "no match"
diff --git a/filemanip.cabal b/filemanip.cabal
--- a/filemanip.cabal
+++ b/filemanip.cabal
@@ -1,5 +1,5 @@
 Name:               filemanip
-Version:            0.3.6.1
+Version:            0.3.6.2
 License:            BSD3
 License-File:       LICENSE
 Author:             Bryan O'Sullivan <bos@serpentine.com>
