diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,11 @@
 Changes
 =======
 
+Version 0.2.4.3
+---------------
+
+Update to optparse-applicative 0.11
+
 Version 0.2.4.2
 ---------------
 
diff --git a/haskell-packages.cabal b/haskell-packages.cabal
--- a/haskell-packages.cabal
+++ b/haskell-packages.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                haskell-packages
-version:             0.2.4.2
+version:             0.2.4.3
 synopsis:            Haskell suite library for package management and integration with Cabal
 description:         See <http://documentup.com/haskell-suite/haskell-packages>
 license:             MIT
@@ -38,7 +38,7 @@
     Paths_haskell_packages
   build-depends:
       base >=4.5 && < 5
-    , optparse-applicative >= 0.10
+    , optparse-applicative >= 0.11
     , aeson >= 0.6
     , bytestring >= 0.9
     , Cabal >= 1.14
diff --git a/src/Distribution/HaskellSuite/Cabal.hs b/src/Distribution/HaskellSuite/Cabal.hs
--- a/src/Distribution/HaskellSuite/Cabal.hs
+++ b/src/Distribution/HaskellSuite/Cabal.hs
@@ -116,14 +116,8 @@
       (strOption (long "build-dir" <> metavar "PATH")) <*>
       (strOption (long "target-dir" <> metavar "PATH")) <*>
       (optional $ strOption (long "dynlib-target-dir" <> metavar "PATH")) <*>
-      (option (ReadM . parsePackageId) (long "package-id" <> metavar "ID")) <*>
-      (many $ argument simpleParse (metavar "MODULE"))
-    where
-      parsePackageId str =
-        maybe
-          (Left . ErrorMsg $ "could not parse package-id: " ++ str)
-          Right
-          (simpleParse str)
+      (option (simpleParseM "package-id") (long "package-id" <> metavar "ID")) <*>
+      (many $ argument (simpleParseM "module") (metavar "MODULE"))
 
   pkgUpdate =
     command "update" $ flip info idm $
@@ -157,14 +151,10 @@
       (optional $ classifyLanguage <$> strOption (short 'G' <> metavar "language")) <*>
       (many $ parseExtension <$> strOption (short 'X' <> metavar "extension")) <*>
       cppOptsParser <*>
-      (option pkgNameReader (long "package-name" <> metavar "NAME-VERSION")) <*>
+      (option (simpleParseM "package name") (long "package-name" <> metavar "NAME-VERSION")) <*>
       pkgDbStackParser <*>
       (many $ InstalledPackageId <$> strOption (long "package-id")) <*>
       (many $ argument str (metavar "MODULE"))
-    where
-      pkgNameReader = ReadM .
-        maybe (Left $ ErrorMsg "invalid package name") Right .
-        simpleParse
 
 data ModuleNotFound = ModuleNotFound String
   deriving Typeable
@@ -201,7 +191,7 @@
 
 pkgIdParser :: Parser PackageId
 pkgIdParser =
-  argument simpleParse (metavar "PACKAGE")
+  argument (simpleParseM "package-id") (metavar "PACKAGE")
 
 pkgDbStackParser :: Parser PackageDBStack
 pkgDbStackParser =
@@ -227,3 +217,19 @@
     includeDir =
       flip fmap (strOption (short 'I' <> metavar "PATH")) $
       \str -> Endo $ \opts -> opts { includes = str : includes opts }
+
+-- | 'simpleParse' is defined in "Distribution.Text" with type
+--
+-- >simpleParse :: Text a => String -> Maybe a
+--
+-- (It is similar to 'read'.)
+--
+-- 'simpleParseM' wraps it as a 'ReadM' value to be used for parsing
+-- command-line options
+simpleParseM :: Text a => String -> ReadM a
+simpleParseM entityName = do
+  str <- readerAsk
+  case simpleParse str of
+    Just thing -> return thing
+    Nothing -> readerError $
+      "could not parse " ++ entityName ++ " '" ++ str ++ "'"
