diff --git a/NEWS b/NEWS
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,11 @@
+Release 0.16.0.0, May 21, 2013
+Changes since release 0.14.0.0:
+
+* Rename OptArgError to InputError
+
+* Change functions in SimpleParser to allow for positional arguments
+  that might fail to be parsed
+
 Release 0.14.0.0, April 8, 2013
 Changes since release 0.12.0.2:
 
diff --git a/System/Console/MultiArg/Combinator.hs b/System/Console/MultiArg/Combinator.hs
--- a/System/Console/MultiArg/Combinator.hs
+++ b/System/Console/MultiArg/Combinator.hs
@@ -8,7 +8,7 @@
 
   -- * Combined long and short option parser
   OptSpec(OptSpec, longOpts, shortOpts, argSpec),
-  OptArgError(..),
+  InputError(..),
   reader,
   optReader,
   ArgSpec(..),
@@ -89,7 +89,7 @@
 
 -- | Reads in values that are members of Read. Provides a generic
 -- error message if the read fails.
-reader :: Read a => String -> Ex.Exceptional OptArgError a
+reader :: Read a => String -> Ex.Exceptional InputError a
 reader s = case reads s of
   (a, ""):[] -> return a
   _ -> Ex.throw . ErrorMsg $ "could not parse option argument"
@@ -101,7 +101,7 @@
 optReader
   :: Read a
   => Maybe String
-  -> Ex.Exceptional OptArgError (Maybe a)
+  -> Ex.Exceptional InputError (Maybe a)
 optReader ms = case ms of
   Nothing -> return Nothing
   Just s -> case reads s of
@@ -109,7 +109,7 @@
     _ -> Ex.throw . ErrorMsg $ "could not parse option argument"
 
 -- | Indicates errors when parsing options to arguments.
-data OptArgError
+data InputError
   = NoMsg
   -- ^ No error message accompanies this failure. multiarg will create
   -- a generic error message for you.
@@ -123,7 +123,7 @@
 
   deriving (Eq, Show)
 
--- | Create an error message from an OptArgError.
+-- | Create an error message from an InputError.
 errorMsg
   :: Either LongOpt ShortOpt
   -- ^ The option with the faulty argument
@@ -131,7 +131,7 @@
   -> [String]
   -- ^ The faulty command line arguments
 
-  -> OptArgError
+  -> InputError
   -> String
 errorMsg badOpt ss err = arg ++ opt ++ msg
   where
@@ -215,23 +215,23 @@
     -- option to GNU grep, which requires the user to supply one of
     -- three arguments: @always@, @never@, or @auto@.
 
-  | OptionalArgE (Maybe String -> Ex.Exceptional OptArgError a)
+  | OptionalArgE (Maybe String -> Ex.Exceptional InputError a)
     -- ^ This option takes an optional argument, like
     -- 'OptionalArg'. Parsing of the optional argument might fail.
 
-  | OneArgE (String -> Ex.Exceptional OptArgError a)
+  | OneArgE (String -> Ex.Exceptional InputError a)
     -- ^ This option takes a single argument, like 'OneArg'. Parsing
     -- of the argument might fail.
 
-  | TwoArgE (String -> String -> Ex.Exceptional OptArgError a)
+  | TwoArgE (String -> String -> Ex.Exceptional InputError a)
     -- ^ This option takes two arguments, like 'TwoArg'. Parsing of
     -- the arguments might fail.
 
-  | ThreeArgE (String -> String -> String -> Ex.Exceptional OptArgError a)
+  | ThreeArgE (String -> String -> String -> Ex.Exceptional InputError a)
     -- ^ This option takes three arguments, like 'ThreeArg'. Parsing
     -- of the arguments might fail.
 
-  | VariableArgE ([String] -> Ex.Exceptional OptArgError a)
+  | VariableArgE ([String] -> Ex.Exceptional InputError a)
     -- ^ This option takes a variable number of arguments, like
     -- 'VariableArg'. Parsing of the arguments might fail.
 
@@ -411,7 +411,7 @@
 
 shortVariableArgE
   :: ShortOpt
-  -> ([String] -> Ex.Exceptional OptArgError a)
+  -> ([String] -> Ex.Exceptional InputError a)
   -> Parser a
 shortVariableArgE so f = do
   maybeSameWordArg <- optional pendingShortOptArg
@@ -427,7 +427,7 @@
 
 shortOneArgE
   :: ShortOpt
-  -> (String -> Ex.Exceptional OptArgError a)
+  -> (String -> Ex.Exceptional InputError a)
   -> Parser a
 shortOneArgE so f = do
   a <- firstShortArg
@@ -454,7 +454,7 @@
 
 shortTwoArgE
   :: ShortOpt
-  -> (String -> String -> Ex.Exceptional OptArgError a)
+  -> (String -> String -> Ex.Exceptional InputError a)
   -> Parser a
 shortTwoArgE so f = do
   a1 <- firstShortArg
@@ -467,7 +467,7 @@
 
 shortThreeArgE
   :: ShortOpt
-  -> (String -> String -> String -> Ex.Exceptional OptArgError a)
+  -> (String -> String -> String -> Ex.Exceptional InputError a)
   -> Parser a
 shortThreeArgE so f = do
   a1 <- firstShortArg
@@ -489,7 +489,7 @@
 
 shortOptionalArgE
   :: ShortOpt
-  -> (Maybe String -> Ex.Exceptional OptArgError a)
+  -> (Maybe String -> Ex.Exceptional InputError a)
   -> Parser a
 shortOptionalArgE so f = do
   maybeSameWordArg <- optional pendingShortOptArg
diff --git a/System/Console/MultiArg/SampleParser.hs b/System/Console/MultiArg/SampleParser.hs
--- a/System/Console/MultiArg/SampleParser.hs
+++ b/System/Console/MultiArg/SampleParser.hs
@@ -56,5 +56,5 @@
 sampleMain :: P.Intersperse -> IO ()
 sampleMain i = do
   as <- getArgs
-  let r = P.simple i specs Filename as
+  let r = P.simple i specs (return . Filename) as
   print r
diff --git a/System/Console/MultiArg/SimpleParser.hs b/System/Console/MultiArg/SimpleParser.hs
--- a/System/Console/MultiArg/SimpleParser.hs
+++ b/System/Console/MultiArg/SimpleParser.hs
@@ -62,10 +62,12 @@
   -> [C.OptSpec a]
   -- ^ All possible options
 
-  -> (String -> a)
+  -> (String -> Ex.Exceptional C.InputError a)
   -- ^ How to handle positional arguments. This function is applied to
   -- the appropriate string every time the parser encounters a
-  -- positional argument.
+  -- positional argument. This function shall return an Exception if
+  -- something was wrong with the argument, or a Success if it is
+  -- okay.
 
   -> [String]
   -- ^ The command line to parse. This function correctly handles
@@ -90,20 +92,39 @@
   next = (() <$ P.nonOptionPosArg) <|> P.stopper
 
 
-parseStopOpts :: P.Parser a -> (String -> a) -> P.Parser [a]
+parsePosArg
+  :: (String -> Ex.Exceptional C.InputError a)
+  -> P.Parser a
+parsePosArg p = do
+  a <- P.nextWord
+  case p a of
+    Ex.Exception e ->
+      let msg = "invalid positional argument: \"" ++ a ++ "\""
+      in case e of
+          C.NoMsg -> fail msg
+          C.ErrorMsg s -> fail $ msg ++ ": " ++ s
+    Ex.Success g -> return g
+
+parseStopOpts
+  :: P.Parser a
+  -> (String -> Ex.Exceptional C.InputError a)
+  -> P.Parser [a]
 parseStopOpts optParser p =
-  (\opts args -> opts ++ map p args)
+  (++)
   <$> parseOptsNoIntersperse optParser
   <* optional P.stopper
-  <*> many P.nextWord
+  <*> many (parsePosArg p)
 
 
 -- | @parseIntersperse o p@ parses options and positional arguments,
 -- where o is a parser that parses options, and p is a function that,
 -- when applied to a string, returns the appropriate type.
-parseIntersperse :: P.Parser a -> (String -> a) -> P.Parser [a]
+parseIntersperse
+  :: P.Parser a
+  -> (String -> Ex.Exceptional C.InputError a)
+  -> P.Parser [a]
 parseIntersperse optParser p =
-  let pa = (Just . p) <$> P.nonOptionPosArg
+  let pa = Just <$> parsePosArg p
       po = Just <$> optParser
       ps = Nothing <$ P.stopper
       parser = po <|> ps <|> pa
@@ -166,10 +187,12 @@
   -- ^ All possible options. Do not add a @-h@ or @--help@ option;
   -- these are added for you.
 
-  -> (String -> a)
+  -> (String -> Ex.Exceptional C.InputError a)
   -- ^ How to handle positional arguments. This function is applied to
   -- the appropriate string every time the parser encounters a
-  -- positional argument.
+  -- positional argument. This function shall return an Exception if
+  -- something was wrong with the argument, or a Success if it is
+  -- okay.
 
   -> IO [a]
   -- ^ If help is requested, the program will print it and exit
@@ -180,7 +203,7 @@
   let os' = addHelpOpt os
   as <- GetArgs.getArgs
   pn <- GetArgs.getProgName
-  let exResult = simple i os' (fmap OtherArg p) as
+  let exResult = simple i os' (fmap (fmap OtherArg) p) as
   rs <- case exResult of
     Ex.Exception e -> do
       IO.hPutStr IO.stderr (C.formatError pn e)
@@ -215,8 +238,10 @@
   , mOpts :: [C.OptSpec b]
     -- ^ Options for this mode
 
-  , mPosArgs :: String -> b
-    -- ^ How to parse positional arguments for this mode
+  , mPosArgs :: String -> Ex.Exceptional C.InputError b
+    -- ^ How to parse positional arguments for this mode. This
+    -- function shall return an Exception if something was wrong with
+    -- the argument, or a Success if it is okay.
 
   , mProcess :: [b] -> result
     -- ^ Processes the options after they have been parsed.
@@ -285,7 +310,7 @@
         Intersperse -> parseIntersperse
         StopOptions -> parseStopOpts
       os' = addHelpOpt os
-  rs <- prsr (C.parseOption os') (fmap OtherArg pa) <* P.end
+  rs <- prsr (C.parseOption os') (fmap (fmap OtherArg) pa) <* P.end
   let (needsHelp, parsedOpts) = partitionHelp rs
   return $ if needsHelp then NeedsHelp (h pn) else NoHelp $ p parsedOpts
 
diff --git a/multiarg.cabal b/multiarg.cabal
--- a/multiarg.cabal
+++ b/multiarg.cabal
@@ -1,5 +1,5 @@
 Name: multiarg
-Version: 0.14.0.0
+Version: 0.16.0.0
 Cabal-version: >=1.8
 Build-Type: Simple
 License: BSD3
