diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,11 @@
 Changes
 =======
 
+Version 0.2.4.2
+---------------
+
+Update to optparse-applicative 0.10
+
 Version 0.2.4.1
 ---------------
 
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.1
+version:             0.2.4.2
 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.6
+    , optparse-applicative >= 0.10
     , aeson >= 0.6
     , bytestring >= 0.9
     , Cabal >= 1.14
@@ -48,6 +48,7 @@
     , containers
     , mtl >= 2.1
     , hse-cpp
-    , either
+    , transformers >= 0.3
+    , transformers-compat >= 0.3
     , haskell-src-exts >= 1.14
     , tagged
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
@@ -21,7 +21,7 @@
 import Options.Applicative
 import Options.Applicative.Types
 import Control.Monad
-import Control.Monad.Trans.Either
+import Control.Monad.Trans.Except
 import Control.Exception
 import Text.Printf
 import qualified Distribution.HaskellSuite.Compiler as Compiler
@@ -116,8 +116,8 @@
       (strOption (long "build-dir" <> metavar "PATH")) <*>
       (strOption (long "target-dir" <> metavar "PATH")) <*>
       (optional $ strOption (long "dynlib-target-dir" <> metavar "PATH")) <*>
-      (nullOption (long "package-id" <> metavar "ID" <> reader (ReadM . parsePackageId))) <*>
-      (arguments simpleParse (metavar "MODULE"))
+      (option (ReadM . parsePackageId) (long "package-id" <> metavar "ID")) <*>
+      (many $ argument simpleParse (metavar "MODULE"))
     where
       parsePackageId str =
         maybe
@@ -157,10 +157,10 @@
       (optional $ classifyLanguage <$> strOption (short 'G' <> metavar "language")) <*>
       (many $ parseExtension <$> strOption (short 'X' <> metavar "extension")) <*>
       cppOptsParser <*>
-      (nullOption (long "package-name" <> metavar "NAME-VERSION" <> reader pkgNameReader)) <*>
+      (option pkgNameReader (long "package-name" <> metavar "NAME-VERSION")) <*>
       pkgDbStackParser <*>
       (many $ InstalledPackageId <$> strOption (long "package-id")) <*>
-      arguments str (metavar "MODULE")
+      (many $ argument str (metavar "MODULE"))
     where
       pkgNameReader = ReadM .
         maybe (Left $ ErrorMsg "invalid package name") Right .
@@ -178,7 +178,7 @@
 
 findModule :: [FilePath] -> String -> IO FilePath
 findModule srcDirs mod = do
-  r <- runEitherT $ sequence_ (checkInDir <$> srcDirs <*> exts)
+  r <- runExceptT $ sequence_ (checkInDir <$> srcDirs <*> exts)
   case r of
     Left found -> return found
     Right {} -> throwIO $ ModuleNotFound mod
@@ -186,7 +186,7 @@
   where
     exts = ["hs", "lhs"]
 
-    checkInDir dir ext = EitherT $ do
+    checkInDir dir ext = ExceptT $ do
       let file = dir </> toFilePath (fromString mod) <.> ext
       found <- doesFileExist file
       return $ if found
