diff --git a/Shadowsocks/Util.hs b/Shadowsocks/Util.hs
--- a/Shadowsocks/Util.hs
+++ b/Shadowsocks/Util.hs
@@ -10,7 +10,6 @@
 import           Data.Maybe (fromMaybe)
 import           GHC.Generics (Generic)
 import           Options.Applicative
-import           Options.Applicative.Types (ReadM(ReadM))
 
 data Config = Config
     { server        :: String
@@ -38,32 +37,20 @@
 readConfig :: FilePath -> IO (Maybe Config)
 readConfig fp = liftM decode' $ L.readFile fp
 
-optStr :: Mod OptionFields (Maybe String) -> Parser (Maybe String)
-optStr m =
-    nullOption $ value Nothing <> reader (success . str) <> m
-  where
-    success = ReadM . Right
-
-maybeOpt :: Read a => Mod OptionFields (Maybe a) -> Parser (Maybe a)
-maybeOpt m =
-    nullOption $ value Nothing <> reader (success . auto) <> m
-  where
-    success = ReadM . Right
-
 configOptions :: Parser Options
 configOptions = Options
-    <$> optStr (long "server" <> short 's' <> metavar "ADDR"
-               <> help "server address")
-    <*> maybeOpt (long "server-port" <> short 'p' <> metavar "PORT"
-                 <> help "server port")
-    <*> maybeOpt (long "local-port" <> short 'l' <> metavar "PORT"
-                 <> help "local port")
-    <*> optStr (long "password" <> short 'k' <> metavar "PASSWORD"
-               <> help "password")
-    <*> optStr (long "method" <> short 'm' <> metavar "METHOD"
-               <> help "encryption method, for example, aes-256-cfb")
-    <*> optStr (long "config" <> short 'c' <> metavar "CONFIG"
-               <> help "path to config file")
+    <$> optional (strOption (long "server" <> short 's' <> metavar "ADDR"
+              <> help "server address"))
+    <*> optional (option auto (long "server-port" <> short 'p' <> metavar "PORT"
+                <> help "server port"))
+    <*> optional (option auto (long "local-port" <> short 'l' <> metavar "PORT"
+                <> help "local port"))
+    <*> optional (strOption (long "password" <> short 'k' <> metavar "PASSWORD"
+              <> help "password"))
+    <*> optional (strOption (long "method" <> short 'm' <> metavar "METHOD"
+              <> help "encryption method, for example, aes-256-cfb"))
+    <*> optional (strOption (long "config" <> short 'c' <> metavar "CONFIG"
+               <> help "path to config file"))
 
 parseConfigOptions :: IO Config
 parseConfigOptions = do
diff --git a/shadowsocks.cabal b/shadowsocks.cabal
--- a/shadowsocks.cabal
+++ b/shadowsocks.cabal
@@ -1,5 +1,5 @@
 name:                shadowsocks
-version:             1.20140713
+version:             1.20141007
 synopsis:            A fast tunnel proxy that help you get through firewalls
 description:
     Shadowsocks implemented in Haskell. Original python version: <https://github.com/clowwindy/shadowsocks>
@@ -33,7 +33,7 @@
                         cryptohash >= 0.11,
                         HsOpenSSL >= 0.11,
                         network >= 2.4,
-                        optparse-applicative >= 0.8,
+                        optparse-applicative >= 0.11,
                         unordered-containers >= 0.2
   default-language:     Haskell2010
 
@@ -51,7 +51,7 @@
                         cryptohash >= 0.11,
                         HsOpenSSL >= 0.11,
                         network >= 2.4,
-                        optparse-applicative >= 0.8,
+                        optparse-applicative >= 0.11,
                         unordered-containers >= 0.2
   default-language:     Haskell2010
 
@@ -60,15 +60,10 @@
   main-is:              test.hs
   ghc-options:          -Wall -fno-warn-unused-do-bind
   build-depends:        base == 4.*,
-                        aeson >= 0.7,
                         binary >= 0.7,
                         bytestring >= 0.9,
                         containers >= 0.5,
                         cryptohash >= 0.11,
-                        HsOpenSSL >= 0.11,
-                        network >= 2.4,
-                        optparse-applicative >= 0.8,
                         process >= 1.1,
-                        HUnit >= 1.2,
-                        unordered-containers >= 0.2
+                        HUnit >= 1.2
   default-language:     Haskell2010
