diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,18 @@
 # Changelog for harg
 
+## 0.3.0.0 [2019.09.16]
+
+- Remove `*With` variants of option constructors and make the `*With` variant behaviour the default
+  (meaning now options are constructed using function composition and not `toOpt`)
+- Remove `opt` prefix from modifiers. Because `default` is a reserved keyword, this is now named
+  `defaultVal` (to mirror `defaultStr`)
+
+  NOTE: the above introduce breaking changes
+
 ## 0.2.0.0 [2019.09.06]
 
 - Trigger a parser failure when any option in the sources fails to parse
+
   NOTE: this introduces a breaking change, in that some parsers that failed silently
         and selected the default (if applicable) will now fail.
 
@@ -12,11 +22,11 @@
 
 ## 0.1.2.0 [2019.08.19]
 
-- Add `optRequired` to mark option as required
+- Add `optRequired` (renamed to `required` for 0.3.0.0) to mark option as required
 
 ## 0.1.1.0 [2019.08.16]
 
-- Add `optDefaultStr` to provide defaults as unparsed strings
+- Add `optDefaultStr` (renamed to `defaultStr` for 0.3.0.0) to provide defaults as unparsed strings
 - Bump dependencies (`barbies` and `higgledy`)
 
 ## 0.1.0.1 [2019.07.19]
diff --git a/README.lhs b/README.lhs
--- a/README.lhs
+++ b/README.lhs
@@ -32,7 +32,6 @@
 {-# LANGUAGE TypeApplications   #-}
 {-# LANGUAGE TypeOperators      #-}
 
-import           Data.Function         ((&))
 import           Data.Functor.Identity (Identity (..))
 import           Data.Kind             (Type)
 import           GHC.Generics          (Generic)
@@ -71,62 +70,47 @@
 ``` haskell
 dbHostOpt :: Opt String
 dbHostOpt
-  = toOpt ( option strParser
-          & optLong "host"
-          & optShort 'h'
-          & optMetavar "DB_HOST"
-          & optHelp "The database host"
-          )
+  = option strParser
+      ( long "host"
+      . short 'h'
+      . metavar "DB_HOST"
+      . help "The database host"
+      )
 
 dbPortOpt :: Opt Int
 dbPortOpt
-  = toOpt ( option readParser
-          & optLong "port"
-          & optHelp "The database port"
-          & optEnvVar "DB_PORT"
-          & optDefault 5432
-          )
+  = option readParser
+      ( long "port"
+      . help "The database port"
+      . envVar "DB_PORT"
+      . defaultVal 5432
+      )
 
 dirOpt :: Opt String
 dirOpt
-  = toOpt ( argument strParser
-          & optHelp "Some directory"
-          & optDefault "/home/user/something"
-          )
+  = argument strParser
+      ( help "Some directory"
+      . defaultVal "/home/user/something"
+      )
 
 logOpt :: Opt Bool
 logOpt
-  = toOpt ( switch
-          & optLong "log"
-          & optHelp "Whether to log or not"
-          )
+  = switch
+      ( long "log"
+      . help "Whether to log or not"
+      )
 ```
 
 Here, we use `option` to define a command line argument that expects a value after it, `argument` to
 define a standalone argument, not prefixed by a long or short indicator, and `switch` to define a
 boolean command line flag that, if present, sets the target value to `True`. The `opt*` functions
 (here applied using `&` to make things look more declarative) modify the option configuration.
-`optHelp` adds help text, `optDefault` adds a default value, `optShort` adds a short command line
-option as an alternative to the long one (the string after `option` or `switch`), `optEnvVar` sets
-the associated environment variable and `optMetavar` sets the metavariable to be shown in the help
+`help` adds help text, `defaultVal` adds a default value, `short` adds a short command line
+option as an alternative to the long one (the string after `option` or `switch`), `envVar` sets
+the associated environment variable and `metavar` sets the metavariable to be shown in the help
 text generated by `optparse-applicative`.
 
-`toOpt` turns any kind of option into the internal `Opt` type. The reason for doing this is that
-different types of options can have different capabilities, e.g. `long` and `short` cannot be set
-for an `argument`. Another shorthand is to use the `with` variants. For example, `dbHostOpt` could
-also be defined like this:
 
-``` haskell
-dbHostOpt' :: Opt String
-dbHostOpt'
-  = optionWith strParser
-      ( optLong "host"
-      . optShort 'h'
-      . optMetavar "DB_HOST"
-      . optHelp "The database host"
-      )
-```
-
 The first argument (`strParser` or `readParser`) is the parser for the argument, be it from the
 command line or from an environment variable. The type of this function should be
 `String -> Either String a`, which produces an error message or the parsed value. `strParser` is
@@ -151,20 +135,20 @@
 message. For example, `readParser` is defined as `parseWith readMaybe`.
 
 Finally, an optional option with type `a` can be specified by setting its type to `Maybe a`. The
-declaration is exactly the same as it would be for `a`, and adding `optOptional` to the modifiers
+declaration is exactly the same as it would be for `a`, and adding `optional` to the modifiers
 turns turns the parser from `String -> Either String a` to `String -> Either String (Maybe a)` but
 without using the `Read` instance for `Maybe`:
 
 ``` haskell ignore
 someOpt :: Opt (Maybe Int)
 someOpt
-  = toOpt ( option readParser
-          & optLong "something"
-          & optOptional
-          )
+  = option readParser
+      ( long "something"
+      . optional
+      )
 ```
 
-Note that `optOptional` can't be used with `optDefault`. Using them together raises a type error at
+Note that `optional` can't be used with `defaultVal`. Using them together raises a type error at
 compile time, to ensure there's no ambiguous behaviour (e.g. the order of declaration of modifiers
 should not influence the resulting option).
 
@@ -322,11 +306,11 @@
 ``` haskell
 portOpt :: Opt Int
 portOpt
-  = toOpt ( option readParser
-          & optLong "port"
-          & optHelp "The service port"
-          & optDefault 8080
-          )
+  = option readParser
+      ( long "port"
+      . help "The service port"
+      . defaultVal 8080
+      )
 ```
 
 Again, there are several ways to configure these options.
@@ -540,19 +524,19 @@
 
 fooOpt :: Opt String
 fooOpt
-  = toOpt ( option strParser
-          & optShort 'f'
-          & optHelp "Something foo"
-          & optDefault "this is the default foo"
-          )
+  = option strParser
+      ( short 'f'
+      . help "Something foo"
+      . defaultVal "this is the default foo"
+      )
 
 barOpt :: Opt Int
 barOpt
-  = toOpt ( option readParser
-          & optShort 'b'
-          & optHelp "Something bar"
-          & optDefault 42
-          )
+  = option readParser
+      ( short 'b'
+      . help "Something bar"
+      . defaultVal 42
+      )
 
 type TestConfigP
   = Single String :* Single Int
@@ -655,35 +639,35 @@
 
 dbHostOpt :: Opt String
 dbHostOpt
-  = toOpt ( option strParser
-          & optLong "host"
-          & optShort 'h'
-          & optMetavar "DB_HOST"
-          & optHelp "The database host"
-          )
+  = option strParser
+      ( long "host"
+      . short 'h'
+      . metavar "DB_HOST"
+      . help "The database host"
+      )
 
 dbPortOpt :: Opt Int
 dbPortOpt
-  = toOpt ( option readParser
-          & optLong "port"
-          & optHelp "The database port"
-          & optEnvVar "DB_PORT"
-          & optDefault 5432
-          )
+  = option readParser
+      ( long "port"
+      . help "The database port"
+      . envVar "DB_PORT"
+      . defaultVal 5432
+      )
 
 dirOpt :: Opt String
 dirOpt
-  = toOpt ( argument strParser
-          & optHelp "Some directory"
-          & optDefault "/home/user/something"
-          )
+  = argument strParser
+      ( help "Some directory"
+      . defaultVal "/home/user/something"
+      )
 
 logOpt :: Opt Bool
 logOpt
-  = toOpt ( switch
-          & optLong "log"
-          & optHelp "Whether to log or not"
-          )
+  = switch
+      ( long "log"
+      . help "Whether to log or not"
+      )
 
 flatConfigOpt3 :: HKD FlatConfig Opt
 flatConfigOpt3
@@ -717,11 +701,11 @@
   where
     jsonOpt :: Opt ConfigFile
     jsonOpt
-      = toOpt ( option strParser
-              & optLong "json"
-              & optShort 'j'
-              & optHelp "JSON config filepath"
-              )
+      = option strParser
+          ( long "json"
+          . short 'j'
+          . help "JSON config filepath"
+          )
 ```
 
 Here, the type of the option for the JSON source is `ConfigFile`. This type is a wrapper around
@@ -739,17 +723,17 @@
 ``` haskell
 jsonOpt :: Opt ConfigFile
 jsonOpt
-  = toOpt ( option strParser
-          & optLong "json"
-          & optDefault NoConfigFile
-          )
+  = option strParser
+      ( long "json"
+      . defaultVal NoConfigFile
+      )
 ```
 
 Also, because `ConfigFile` has an `IsString` instance, there's no need to say
-`optLong (ConfigFile "json")` (if `OverloadedStrings` is enabled).
+`long (ConfigFile "json")` (if `OverloadedStrings` is enabled).
 
 There's a bit of a disconnect between `ConfigFile` and the ability to make optional options using
-`Maybe` and `optOptional`. The reason for it is that the type that `JSONSource` wraps is not
+`Maybe` and `optional`. The reason for it is that the type that `JSONSource` wraps is not
 polymorphic, since it needs to be a filepath specifically.
 
 # Roadmap
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -32,7 +32,6 @@
 {-# LANGUAGE TypeApplications   #-}
 {-# LANGUAGE TypeOperators      #-}
 
-import           Data.Function         ((&))
 import           Data.Functor.Identity (Identity (..))
 import           Data.Kind             (Type)
 import           GHC.Generics          (Generic)
@@ -71,62 +70,47 @@
 ``` haskell
 dbHostOpt :: Opt String
 dbHostOpt
-  = toOpt ( option strParser
-          & optLong "host"
-          & optShort 'h'
-          & optMetavar "DB_HOST"
-          & optHelp "The database host"
-          )
+  = option strParser
+      ( long "host"
+      . short 'h'
+      . metavar "DB_HOST"
+      . help "The database host"
+      )
 
 dbPortOpt :: Opt Int
 dbPortOpt
-  = toOpt ( option readParser
-          & optLong "port"
-          & optHelp "The database port"
-          & optEnvVar "DB_PORT"
-          & optDefault 5432
-          )
+  = option readParser
+      ( long "port"
+      . help "The database port"
+      . envVar "DB_PORT"
+      . defaultVal 5432
+      )
 
 dirOpt :: Opt String
 dirOpt
-  = toOpt ( argument strParser
-          & optHelp "Some directory"
-          & optDefault "/home/user/something"
-          )
+  = argument strParser
+      ( help "Some directory"
+      . defaultVal "/home/user/something"
+      )
 
 logOpt :: Opt Bool
 logOpt
-  = toOpt ( switch
-          & optLong "log"
-          & optHelp "Whether to log or not"
-          )
+  = switch
+      ( long "log"
+      . help "Whether to log or not"
+      )
 ```
 
 Here, we use `option` to define a command line argument that expects a value after it, `argument` to
 define a standalone argument, not prefixed by a long or short indicator, and `switch` to define a
 boolean command line flag that, if present, sets the target value to `True`. The `opt*` functions
 (here applied using `&` to make things look more declarative) modify the option configuration.
-`optHelp` adds help text, `optDefault` adds a default value, `optShort` adds a short command line
-option as an alternative to the long one (the string after `option` or `switch`), `optEnvVar` sets
-the associated environment variable and `optMetavar` sets the metavariable to be shown in the help
+`help` adds help text, `defaultVal` adds a default value, `short` adds a short command line
+option as an alternative to the long one (the string after `option` or `switch`), `envVar` sets
+the associated environment variable and `metavar` sets the metavariable to be shown in the help
 text generated by `optparse-applicative`.
 
-`toOpt` turns any kind of option into the internal `Opt` type. The reason for doing this is that
-different types of options can have different capabilities, e.g. `long` and `short` cannot be set
-for an `argument`. Another shorthand is to use the `with` variants. For example, `dbHostOpt` could
-also be defined like this:
 
-``` haskell
-dbHostOpt' :: Opt String
-dbHostOpt'
-  = optionWith strParser
-      ( optLong "host"
-      . optShort 'h'
-      . optMetavar "DB_HOST"
-      . optHelp "The database host"
-      )
-```
-
 The first argument (`strParser` or `readParser`) is the parser for the argument, be it from the
 command line or from an environment variable. The type of this function should be
 `String -> Either String a`, which produces an error message or the parsed value. `strParser` is
@@ -151,20 +135,20 @@
 message. For example, `readParser` is defined as `parseWith readMaybe`.
 
 Finally, an optional option with type `a` can be specified by setting its type to `Maybe a`. The
-declaration is exactly the same as it would be for `a`, and adding `optOptional` to the modifiers
+declaration is exactly the same as it would be for `a`, and adding `optional` to the modifiers
 turns turns the parser from `String -> Either String a` to `String -> Either String (Maybe a)` but
 without using the `Read` instance for `Maybe`:
 
 ``` haskell ignore
 someOpt :: Opt (Maybe Int)
 someOpt
-  = toOpt ( option readParser
-          & optLong "something"
-          & optOptional
-          )
+  = option readParser
+      ( long "something"
+      . optional
+      )
 ```
 
-Note that `optOptional` can't be used with `optDefault`. Using them together raises a type error at
+Note that `optional` can't be used with `defaultVal`. Using them together raises a type error at
 compile time, to ensure there's no ambiguous behaviour (e.g. the order of declaration of modifiers
 should not influence the resulting option).
 
@@ -322,11 +306,11 @@
 ``` haskell
 portOpt :: Opt Int
 portOpt
-  = toOpt ( option readParser
-          & optLong "port"
-          & optHelp "The service port"
-          & optDefault 8080
-          )
+  = option readParser
+      ( long "port"
+      . help "The service port"
+      . defaultVal 8080
+      )
 ```
 
 Again, there are several ways to configure these options.
@@ -540,19 +524,19 @@
 
 fooOpt :: Opt String
 fooOpt
-  = toOpt ( option strParser
-          & optShort 'f'
-          & optHelp "Something foo"
-          & optDefault "this is the default foo"
-          )
+  = option strParser
+      ( short 'f'
+      . help "Something foo"
+      . defaultVal "this is the default foo"
+      )
 
 barOpt :: Opt Int
 barOpt
-  = toOpt ( option readParser
-          & optShort 'b'
-          & optHelp "Something bar"
-          & optDefault 42
-          )
+  = option readParser
+      ( short 'b'
+      . help "Something bar"
+      . defaultVal 42
+      )
 
 type TestConfigP
   = Single String :* Single Int
@@ -655,35 +639,35 @@
 
 dbHostOpt :: Opt String
 dbHostOpt
-  = toOpt ( option strParser
-          & optLong "host"
-          & optShort 'h'
-          & optMetavar "DB_HOST"
-          & optHelp "The database host"
-          )
+  = option strParser
+      ( long "host"
+      . short 'h'
+      . metavar "DB_HOST"
+      . help "The database host"
+      )
 
 dbPortOpt :: Opt Int
 dbPortOpt
-  = toOpt ( option readParser
-          & optLong "port"
-          & optHelp "The database port"
-          & optEnvVar "DB_PORT"
-          & optDefault 5432
-          )
+  = option readParser
+      ( long "port"
+      . help "The database port"
+      . envVar "DB_PORT"
+      . defaultVal 5432
+      )
 
 dirOpt :: Opt String
 dirOpt
-  = toOpt ( argument strParser
-          & optHelp "Some directory"
-          & optDefault "/home/user/something"
-          )
+  = argument strParser
+      ( help "Some directory"
+      . defaultVal "/home/user/something"
+      )
 
 logOpt :: Opt Bool
 logOpt
-  = toOpt ( switch
-          & optLong "log"
-          & optHelp "Whether to log or not"
-          )
+  = switch
+      ( long "log"
+      . help "Whether to log or not"
+      )
 
 flatConfigOpt3 :: HKD FlatConfig Opt
 flatConfigOpt3
@@ -717,11 +701,11 @@
   where
     jsonOpt :: Opt ConfigFile
     jsonOpt
-      = toOpt ( option strParser
-              & optLong "json"
-              & optShort 'j'
-              & optHelp "JSON config filepath"
-              )
+      = option strParser
+          ( long "json"
+          . short 'j'
+          . help "JSON config filepath"
+          )
 ```
 
 Here, the type of the option for the JSON source is `ConfigFile`. This type is a wrapper around
@@ -739,17 +723,17 @@
 ``` haskell
 jsonOpt :: Opt ConfigFile
 jsonOpt
-  = toOpt ( option strParser
-          & optLong "json"
-          & optDefault NoConfigFile
-          )
+  = option strParser
+      ( long "json"
+      . defaultVal NoConfigFile
+      )
 ```
 
 Also, because `ConfigFile` has an `IsString` instance, there's no need to say
-`optLong (ConfigFile "json")` (if `OverloadedStrings` is enabled).
+`long (ConfigFile "json")` (if `OverloadedStrings` is enabled).
 
 There's a bit of a disconnect between `ConfigFile` and the ability to make optional options using
-`Maybe` and `optOptional`. The reason for it is that the type that `JSONSource` wraps is not
+`Maybe` and `optional`. The reason for it is that the type that `JSONSource` wraps is not
 polymorphic, since it needs to be a filepath specifically.
 
 # Roadmap
diff --git a/harg.cabal b/harg.cabal
--- a/harg.cabal
+++ b/harg.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.2
 
 name:           harg
-version:        0.2.0.0
+version:        0.3.0.0
 synopsis:       Haskell program configuration using higher kinded data
 description:    Please see the README on GitHub at <https://github.com/alexpeits/harg#readme>
 homepage:       https://github.com/alexpeits/harg
diff --git a/src/Options/Harg.hs b/src/Options/Harg.hs
--- a/src/Options/Harg.hs
+++ b/src/Options/Harg.hs
@@ -5,15 +5,10 @@
 
     -- ** Option declaration
     option
-  , optionWith
   , flag
-  , flagWith
   , switch
-  , switchWith
   , switch'
-  , switchWith'
   , argument
-  , argumentWith
 
   , Single (..)
   , single
@@ -31,15 +26,15 @@
   , Tagged (..)
 
   -- ** Option modifiers
-  , optLong
-  , optShort
-  , optHelp
-  , optMetavar
-  , optEnvVar
-  , optDefault
-  , optDefaultStr
-  , optRequired
-  , optOptional
+  , long
+  , short
+  , help
+  , metavar
+  , envVar
+  , defaultVal
+  , defaultStr
+  , required
+  , optional
   , toOpt
   , Opt
 
@@ -80,10 +75,12 @@
   , pattern In5
 
   -- ** Re-exports
+  -- *** barbies
   , B.FunctorB
   , B.TraversableB
   , B.ProductB
 
+  -- *** higgledy
   , HKD.HKD
   , HKD.build
   , HKD.construct
@@ -132,28 +129,28 @@
 --     where
 --       hostOpt
 --         = optionWith strParser
---             ( optLong \"host\"
---             . optShort \'h\'
---             . optHelp \"Hostname\"
---             . optEnvVar \"HOST_NAME\"
+--             ( long \"host\"
+--             . short \'h\'
+--             . help \"Hostname\"
+--             . envVar \"HOST_NAME\"
 --             )
 --       portOpt
 --         = optionWith readParser
---             ( optLong \"port\"
---             . optShort \'p\'
---             . optHelp \"Port number\"
---             . optDefault 5432
+--             ( long \"port\"
+--             . short \'p\'
+--             . help \"Port number\"
+--             . defaultVal 5432
 --             )
 --       logOpt
 --         = switchWith
---             ( optLong \"log\"
---             . optHelp \"Whether to log or not\"
+--             ( long \"log\"
+--             . help \"Whether to log or not\"
 --             )
 --       dirOpt
 --         = argumentWith strParser
---             ( optHelp \"Some directory\"
---             . optEnvVar \"SOME_DIR\"
---             . optOptional
+--             ( help \"Some directory\"
+--             . envVar \"SOME_DIR\"
+--             . optional
 --             )
 --
 --   main :: IO Config
diff --git a/src/Options/Harg/Cmdline.hs b/src/Options/Harg/Cmdline.hs
--- a/src/Options/Harg/Cmdline.hs
+++ b/src/Options/Harg/Cmdline.hs
@@ -58,7 +58,7 @@
           , Optparse.short <$> _optShort
           , Optparse.help <$> ppHelp opt
           , Optparse.metavar <$> _optMetavar
-          , Optparse.value <$> (getCompose sources <|> _optDefault)
+          , Optparse.value <$> (getCompose sources <|> _optDefaultVal)
           ]
       )
 
@@ -79,7 +79,7 @@
   where
     mDef
       = case getCompose sources of
-          Nothing -> _optDefault
+          Nothing -> _optDefaultVal
           Just x  -> Just x
     modifiers
       = foldMap (fromMaybe mempty)
@@ -99,6 +99,6 @@
       ( foldMap (fromMaybe mempty)
           [ Optparse.help <$> ppHelp opt
           , Optparse.metavar <$> _optMetavar
-          , Optparse.value <$> (getCompose sources <|> _optDefault)
+          , Optparse.value <$> (getCompose sources <|> _optDefaultVal)
           ]
       )
diff --git a/src/Options/Harg/Construct.hs b/src/Options/Harg/Construct.hs
--- a/src/Options/Harg/Construct.hs
+++ b/src/Options/Harg/Construct.hs
@@ -17,108 +17,108 @@
 
 class HasLong o (attr :: [OptAttr]) where
   -- | Add a 'Options.Applicative.long' modifier to an option
-  optLong :: String -> o attr a -> o attr a
+  long :: String -> o attr a -> o attr a
 
 instance HasLong OptionOpt a where
-  optLong s o = o { _oLong = Just s }
+  long s o = o { _oLong = Just s }
 
 instance HasLong FlagOpt a where
-  optLong s o = o { _fLong = Just s }
+  long s o = o { _fLong = Just s }
 
 class HasShort o (attr :: [OptAttr]) where
   -- | Add a 'Options.Applicative.short' modifier to an option
-  optShort :: Char -> o attr a -> o attr a
+  short :: Char -> o attr a -> o attr a
 
 instance HasShort OptionOpt a where
-  optShort c o = o { _oShort = Just c }
+  short c o = o { _oShort = Just c }
 
 instance HasShort FlagOpt a where
-  optShort c o = o { _fShort = Just c }
+  short c o = o { _fShort = Just c }
 
 class HasHelp o (attr :: [OptAttr]) where
   -- | Add 'Options.Applicative.help' to an option
-  optHelp :: String -> o attr a -> o attr a
+  help :: String -> o attr a -> o attr a
 
 instance HasHelp OptionOpt a where
-  optHelp s o = o { _oHelp = Just s }
+  help s o = o { _oHelp = Just s }
 
 instance HasHelp FlagOpt a where
-  optHelp s o = o { _fHelp = Just s }
+  help s o = o { _fHelp = Just s }
 
 instance HasHelp ArgumentOpt a where
-  optHelp s o = o { _aHelp = Just s }
+  help s o = o { _aHelp = Just s }
 
 class HasMetavar o (attr :: [OptAttr]) where
   -- | Add a 'Options.Applicative.metavar' metavar to an option, to be
   -- displayed as the meta-parameter next to long/short modifiers
-  optMetavar :: String -> o attr a -> o attr a
+  metavar :: String -> o attr a -> o attr a
 
 instance HasMetavar OptionOpt a where
-  optMetavar s o = o { _oMetavar = Just s }
+  metavar s o = o { _oMetavar = Just s }
 
 instance HasMetavar ArgumentOpt a where
-  optMetavar s o = o { _aMetavar = Just s }
+  metavar s o = o { _aMetavar = Just s }
 
 class HasEnvVar o (attr :: [OptAttr]) where
   -- | Specify an environment variable to lookup for an option
-  optEnvVar :: String -> o attr a -> o attr a
+  envVar :: String -> o attr a -> o attr a
 
 instance HasEnvVar OptionOpt a where
-  optEnvVar s o = o { _oEnvVar = Just s }
+  envVar s o = o { _oEnvVar = Just s }
 
 instance HasEnvVar FlagOpt a where
-  optEnvVar s o = o { _fEnvVar = Just s }
+  envVar s o = o { _fEnvVar = Just s }
 
 instance HasEnvVar ArgumentOpt a where
-  optEnvVar s o = o { _aEnvVar = Just s }
+  envVar s o = o { _aEnvVar = Just s }
 
-class HasDefault o (attr :: [OptAttr]) where
+class HasDefaultVal o (attr :: [OptAttr]) where
   -- | Add a default value to an option. Cannot be used in conjuction with
-  -- with 'optRequired', 'optDefaultStr' or 'optOptional'.
-  optDefault
-    :: ( NotInAttrs OptDefault attr (DuplicateAttrMultipleErr "optDefault" '["optDefaultStr", "optRequired"])
-       , NotInAttrs OptOptional attr (IncompatibleAttrsErr "optDefault" "optOptional")
+  -- with 'required', 'defaultStr' or 'optional'.
+  defaultVal
+    :: ( NotInAttrs OptDefault attr (DuplicateAttrMultipleErr "defaultVal" '["defaultStr", "required"])
+       , NotInAttrs OptOptional attr (IncompatibleAttrsErr "defaultVal" "optional")
        )
     => a -> o attr a -> o (OptDefault ': attr) a
 
-instance HasDefault OptionOpt a where
-  optDefault a o = o { _oDefault = Just a }
+instance HasDefaultVal OptionOpt a where
+  defaultVal a o = o { _oDefaultVal = Just a }
 
-instance HasDefault ArgumentOpt a where
-  optDefault a o = o { _aDefault = Just a }
+instance HasDefaultVal ArgumentOpt a where
+  defaultVal a o = o { _aDefaultVal = Just a }
 
-class HasDefaultStr o (attr :: [OptAttr]) where
+class HasDefaultValStr o (attr :: [OptAttr]) where
   -- | Add a default unparsed value to an option. Cannot be used in conjuction
-  -- with 'optDefault', 'optRequired' or 'optOptional'.
-  optDefaultStr
-    :: ( NotInAttrs OptDefault attr (DuplicateAttrMultipleErr "optDefaultStr" '["optDefault", "optRequired"])
-       , NotInAttrs OptOptional attr (IncompatibleAttrsErr "optDefaultStr" "optOptional")
+  -- with 'defaultVal', 'required' or 'optional'.
+  defaultStr
+    :: ( NotInAttrs OptDefault attr (DuplicateAttrMultipleErr "defaultStr" '["defaultVal", "required"])
+       , NotInAttrs OptOptional attr (IncompatibleAttrsErr "defaultStr" "optional")
        )
     => String -> o attr a -> o (OptDefault ': attr) a
 
-instance HasDefaultStr OptionOpt a where
-  optDefaultStr s o = o { _oDefaultStr = Just s }
+instance HasDefaultValStr OptionOpt a where
+  defaultStr s o = o { _oDefaultStr = Just s }
 
-instance HasDefaultStr ArgumentOpt a where
-  optDefaultStr s o = o { _aDefaultStr = Just s }
+instance HasDefaultValStr ArgumentOpt a where
+  defaultStr s o = o { _aDefaultStr = Just s }
 
 class HasRequired o (attr :: [OptAttr]) where
   -- | Mark an option as required. Cannot be used in conjunction with
-  -- 'optOptional', 'optDefault' or 'optRequiredStr'.
-  optRequired
-    :: ( NotInAttrs OptDefault attr (DuplicateAttrMultipleErr "optRequired" '["optDefault", "optDefaultStr"])
-       , NotInAttrs OptOptional attr (IncompatibleAttrsErr "optRequired" "optOptional")
+  -- 'optional', 'defaultVal' or 'requiredStr'.
+  required
+    :: ( NotInAttrs OptDefault attr (DuplicateAttrMultipleErr "required" '["defaultVal", "defaultStr"])
+       , NotInAttrs OptOptional attr (IncompatibleAttrsErr "required" "optional")
        )
     => o attr a -> o (OptDefault ': attr) a
 
 instance HasRequired OptionOpt a where
-  optRequired o = o { _oDefault = Nothing }
+  required o = o { _oDefaultVal = Nothing }
 
 instance HasRequired ArgumentOpt a where
-  optRequired o = o { _aDefault = Nothing }
+  required o = o { _aDefaultVal = Nothing }
 
 -- | Class for options that can be optional. Cannot be used in conjunction with
--- 'HasDefault', 'HasDefaultStr' or 'HasRequired'. Note that this will turn a
+-- 'HasDefaultVal', 'HasDefaultValStr' or 'HasRequired'. Note that this will turn a
 -- parser for @a@ into a parser for @Maybe a@, modifying the reader function
 -- appropriately.
 -- For example:
@@ -127,40 +127,40 @@
 --   someOpt :: Opt (Maybe Int)
 --   someOpt
 --     = optionWith readParser
---         ( optLong "someopt"
---         . optOptional
+--         ( long "someopt"
+--         . optional
 --         )
 -- @
 class HasOptional o (attr :: [OptAttr]) where
   -- | Specify that an option is optional. This will convert an @Opt a@ to an
-  -- @Opt (Maybe a)@. Cannot be used in conjunction with 'optDefault', 'optDefaultStr'
-  -- or 'optRequired'.
-  optOptional
-    :: ( NotInAttrs OptOptional attr (DuplicateAttrErr "optOptional")
-       , NotInAttrs OptDefault attr (IncompatibleAttrsErr "optOptional" "optDefault")
+  -- @Opt (Maybe a)@. Cannot be used in conjunction with 'defaultVal', 'defaultStr'
+  -- or 'required'.
+  optional
+    :: ( NotInAttrs OptOptional attr (DuplicateAttrErr "optional")
+       , NotInAttrs OptDefault attr (IncompatibleAttrsErr "optional" "defaultVal")
        )
     => o attr a -> o (OptOptional ': attr) (Maybe a)
 
 instance HasOptional OptionOpt a where
-  optOptional OptionOpt{..}
+  optional OptionOpt{..}
     = OptionOpt
         { _oLong       = _oLong
         , _oShort      = _oShort
         , _oHelp       = _oHelp
         , _oMetavar    = _oMetavar
         , _oEnvVar     = _oEnvVar
-        , _oDefault    = Just Nothing
+        , _oDefaultVal = Just Nothing
         , _oDefaultStr = Nothing
         , _oReader     = fmap Just . _oReader
         }
 
 instance HasOptional ArgumentOpt a where
-  optOptional ArgumentOpt{..}
+  optional ArgumentOpt{..}
     = ArgumentOpt
         { _aHelp       = _aHelp
         , _aMetavar    = _aMetavar
         , _aEnvVar     = _aEnvVar
-        , _aDefault    = Just Nothing
+        , _aDefaultVal = Just Nothing
         , _aDefaultStr = Nothing
         , _aReader     = fmap Just . _aReader
         }
@@ -179,7 +179,7 @@
         , _optHelp       = _oHelp
         , _optMetavar    = _oMetavar
         , _optEnvVar     = _oEnvVar
-        , _optDefault    = _oDefault
+        , _optDefaultVal = _oDefaultVal
         , _optDefaultStr = _oDefaultStr
         , _optReader     = _oReader
         , _optType       = OptionOptType
@@ -193,7 +193,7 @@
         , _optHelp       = _fHelp
         , _optMetavar    = Nothing
         , _optEnvVar     = _fEnvVar
-        , _optDefault    = Just _fDefault
+        , _optDefaultVal = Just _fDefaultVal
         , _optDefaultStr = Nothing
         , _optReader     = _fReader
         , _optType       = FlagOptType _fActive
@@ -207,105 +207,76 @@
         , _optHelp       = _aHelp
         , _optMetavar    = _aMetavar
         , _optEnvVar     = _aEnvVar
-        , _optDefault    = _aDefault
+        , _optDefaultVal = _aDefaultVal
         , _optDefaultStr = _aDefaultStr
         , _optReader     = _aReader
         , _optType       = ArgumentOptType
         }
 
 -- | Create an option parser, equivalent to 'Options.Applicative.option'. The
--- result can then be used with 'toOpt' to convert into the global 'Opt' type.
---
--- @
---   someOption :: Opt Int
---   someOption
---     = toOpt ( option readParser
---             & optLong "someopt"
---             & optHelp "Some option"
---             & optDefault 256
---             )
--- @
-option
-  :: OptReader a
-  -> OptionOpt '[] a
-option p
-  = OptionOpt
-      { _oLong       = Nothing
-      , _oShort      = Nothing
-      , _oHelp       = Nothing
-      , _oMetavar    = Nothing
-      , _oEnvVar     = Nothing
-      , _oDefault    = Nothing
-      , _oDefaultStr = Nothing
-      , _oReader     = p
-      }
-
--- | Similar to 'option', but accepts a modifier function and returns an 'Opt'
--- directly.
+-- second argument is the modifiers to add to the option, and can be defined by
+-- using function composition ('.').
 --
 -- @
 --   someOption :: Opt Int
 --   someOption
---     = optionWith readParser
---         ( optLong "someopt"
---         . optHelp "Some option"
---         . optDefault 256
+--     = option readParser
+--         ( long "someopt"
+--         . help "Some option"
+--         . defaultVal 256
 --         )
 -- @
-optionWith
+option
   :: OptReader a
   -> (OptionOpt '[] a -> OptionOpt attr b)
   -> Opt b
-optionWith p f
-  = toOpt $ f (option p)
+option p f
+  = toOpt $ f opt
+  where
+    opt
+      = OptionOpt
+          { _oLong       = Nothing
+          , _oShort      = Nothing
+          , _oHelp       = Nothing
+          , _oMetavar    = Nothing
+          , _oEnvVar     = Nothing
+          , _oDefaultVal = Nothing
+          , _oDefaultStr = Nothing
+          , _oReader     = p
+          }
 
 -- | Create a flag parser, equivalent to 'Options.Applicative.option'. The
 -- first argument is the default value (returned when the flag modifier is
 -- absent), and the second is the active value (returned when the flag
--- modifier is present). The result can then be used with 'toOpt' to convert
--- into the global 'Opt' type.
---
--- @
---   someFlag :: Opt Int
---   someFlag
---     = toOpt ( flag 0 1
---             & optLong "someflag"
---             & optHelp "Some flag"
---             )
--- @
-flag
-  :: a  -- ^ Default value
-  -> a  -- ^ Active value
-  -> FlagOpt '[] a
-flag d active
-  = FlagOpt
-      { _fLong    = Nothing
-      , _fShort   = Nothing
-      , _fHelp    = Nothing
-      , _fEnvVar  = Nothing
-      , _fDefault = d
-      , _fActive  = active
-      , _fReader  = const (pure d)  -- TODO
-      }
-
--- | Similar to 'flag', but accepts a modifier function and returns an 'Opt'
--- directly.
+-- modifier is present). The second argument is the modifiers to add to the
+-- option, and can be defined by using function composition ('.').
 --
 -- @
 --   someFlag :: Opt Int
 --   someFlag
---     = flagWith 0 1
---         ( optLong "someflag"
---         . optHelp "Some flag"
+--     = flag 0 1
+--         ( long "someflag"
+--         . help "Some flag"
 --         )
 -- @
-flagWith
+flag
   :: a  -- ^ Default value
   -> a  -- ^ Active value
   -> (FlagOpt '[] a -> FlagOpt attr b)
   -> Opt b
-flagWith d active f
-  = toOpt $ f (flag d active)
+flag d active f
+  = toOpt $ f opt
+  where
+    opt
+      = FlagOpt
+          { _fLong       = Nothing
+          , _fShort      = Nothing
+          , _fHelp       = Nothing
+          , _fEnvVar     = Nothing
+          , _fDefaultVal = d
+          , _fActive     = active
+          , _fReader     = const (pure d)  -- TODO
+          }
 
 -- | A 'flag' parser, specialized to 'Bool'. The parser (e.g. when parsing
 -- an environment variable) will accept @true@ and @false@, but case
@@ -315,92 +286,59 @@
 -- @
 --   someSwitch :: Opt Bool
 --   someSwitch
---     = toOpt ( switch
---             & optLong "someswitch"
---             & optHelp "Some switch"
---             )
--- @
-switch :: FlagOpt '[] Bool
-switch
-  = fl { _fReader = boolParser }
-  where
-    fl = flag False True
-
--- | Similar to 'switch', but accepts a modifier function and returns an 'Opt'
--- directly.
---
--- @
---   someSwitch :: Opt Bool
---   someSwitch
---     = switchWith
---         ( optLong "someswitch"
---         . optHelp "Some switch"
+--     = switch
+--         ( long "someswitch"
+--         . help "Some switch"
 --         )
 -- @
-switchWith
+switch
   :: (FlagOpt '[] Bool -> FlagOpt attr Bool)
   -> Opt Bool
-switchWith f
-  = toOpt $ f switch
+switch f
+  = fl { _optReader = boolParser }
+  where
+    fl
+      = flag False True f
 
 -- | Similar to 'switch', but the default value is 'True' and the active is
 -- 'False'.
-switch' :: FlagOpt '[] Bool
 switch'
-  = fl { _fReader = boolParser }
-  where
-    fl = flag True False
-
--- | Similar to 'switch'', but accepts a modifier function and returns an 'Opt'
--- directly.
-switchWith'
   :: (FlagOpt '[] Bool -> FlagOpt attr Bool)
   -> Opt Bool
-switchWith' f
-  = toOpt $ f switch'
+switch' f
+  = fl { _optReader = boolParser }
+  where
+    fl
+      = flag True False f
 
 -- | Create an argument parser, equivalent to 'Options.Applicative.argument'.
--- The result can then be used with 'toOpt' to convert into the global 'Opt'
--- type.
---
--- @
---   someArgument :: Opt String
---   someArgument
---     = toOpt ( argument strParser
---             & optHelp "Some argument"
---             & optDefault "this is the default"
---             )
--- @
-argument
-  :: OptReader a
-  -> ArgumentOpt '[] a
-argument p
-  = ArgumentOpt
-      { _aHelp       = Nothing
-      , _aMetavar    = Nothing
-      , _aEnvVar     = Nothing
-      , _aDefault    = Nothing
-      , _aDefaultStr = Nothing
-      , _aReader     = p
-      }
-
--- | Similar to 'argument', but accepts a modifier function and returns an
--- 'Opt' directly.
+-- The second argument is the modifiers to add to the option, and can be
+-- defined by using function composition ('.').
 --
 -- @
 --   someArgument :: Opt Int
 --   someArgument
---     = argumentWith
---         ( optHelp "Some argument"
---         . optDefault "this is the default"
+--     = argument
+--         ( help "Some argument"
+--         . defaultVal "this is the default"
 --         )
 -- @
-argumentWith
+argument
   :: OptReader a
   -> (ArgumentOpt '[] a -> ArgumentOpt attr b)
   -> Opt b
-argumentWith p f
-  = toOpt $ f (argument p)
+argument p f
+  = toOpt $ f opt
+  where
+    opt
+      = ArgumentOpt
+          { _aHelp       = Nothing
+          , _aMetavar    = Nothing
+          , _aEnvVar     = Nothing
+          , _aDefaultVal = Nothing
+          , _aDefaultStr = Nothing
+          , _aReader     = p
+          }
 
 -- | Convert a parser that returns 'Maybe' to a parser that returns 'Either',
 -- with the default 'Left' value @unable to parse: \<input\>@.
diff --git a/src/Options/Harg/Sources/JSON.hs b/src/Options/Harg/Sources/JSON.hs
--- a/src/Options/Harg/Sources/JSON.hs
+++ b/src/Options/Harg/Sources/JSON.hs
@@ -20,7 +20,7 @@
   deriving (Generic, B.FunctorB, B.TraversableB, B.ProductB)
 
 -- | The result of reading a JSON file. @JSONSourceNotRequired@ is used when
--- the user has specified @optDefault NoConfigFile@. It holds the contents of
+-- the user has specified @defaultVal NoConfigFile@. It holds the contents of
 -- the JSON file as a 'JSON.Value'.
 data JSONSourceVal
   = JSONSourceVal JSON.Value
diff --git a/src/Options/Harg/Sources/Types.hs b/src/Options/Harg/Sources/Types.hs
--- a/src/Options/Harg/Sources/Types.hs
+++ b/src/Options/Harg/Sources/Types.hs
@@ -71,8 +71,8 @@
 --     where
 --       jsonOpt
 --         = optionWith strParser
---             ( optLong "json-config"
---             . optDefault (ConfigFile "~/config.json")
+--             ( long "json-config"
+--             . defaultVal (ConfigFile "~/config.json")
 --             )
 -- @
 --
@@ -84,8 +84,8 @@
 --     where
 --       jsonOpt
 --         = optionWith strParser
---             ( optLong "json-config"
---             . optDefault NoConfigFile
+--             ( long "json-config"
+--             . defaultVal NoConfigFile
 --             )
 -- @
 --
diff --git a/src/Options/Harg/Sources/YAML.hs b/src/Options/Harg/Sources/YAML.hs
--- a/src/Options/Harg/Sources/YAML.hs
+++ b/src/Options/Harg/Sources/YAML.hs
@@ -23,7 +23,7 @@
   deriving (Generic, B.FunctorB, B.TraversableB, B.ProductB)
 
 -- | The result of reading a YAML file. @YAMLSourceNotRequired@ is used when
--- the user has specified @optDefault NoConfigFile@. It holds the contents of
+-- the user has specified @defaultVal NoConfigFile@. It holds the contents of
 -- the YAML file as a 'BS.ByteString'.
 data YAMLSourceVal
   = YAMLSourceVal BS.ByteString
diff --git a/src/Options/Harg/Types.hs b/src/Options/Harg/Types.hs
--- a/src/Options/Harg/Types.hs
+++ b/src/Options/Harg/Types.hs
@@ -14,7 +14,7 @@
                                        --   with @--help/-h@ or in case of error
       , _optMetavar    :: Maybe String -- ^ Metavar to be shown in the help description
       , _optEnvVar     :: Maybe String -- ^ Environment variable for use with 'EnvSource'
-      , _optDefault    :: Maybe a      -- ^ Default value
+      , _optDefaultVal :: Maybe a      -- ^ Default value
       , _optDefaultStr :: Maybe String -- ^ Default value as string (unparsed)
       , _optReader     :: OptReader a  -- ^ Option parser
       , _optType       :: OptType a    -- ^ Option type
@@ -42,7 +42,7 @@
       , _oHelp       :: Maybe String
       , _oMetavar    :: Maybe String
       , _oEnvVar     :: Maybe String
-      , _oDefault    :: Maybe a
+      , _oDefaultVal :: Maybe a
       , _oDefaultStr :: Maybe String
       , _oReader     :: OptReader a
       }
@@ -51,13 +51,13 @@
 -- value. Corresponds to 'Options.Applicative.flag'.
 data FlagOpt (attr :: [OptAttr]) a
   = FlagOpt
-      { _fLong    :: Maybe String
-      , _fShort   :: Maybe Char
-      , _fHelp    :: Maybe String
-      , _fEnvVar  :: Maybe String
-      , _fDefault :: a
-      , _fReader  :: OptReader a
-      , _fActive  :: a
+      { _fLong       :: Maybe String
+      , _fShort      :: Maybe Char
+      , _fHelp       :: Maybe String
+      , _fEnvVar     :: Maybe String
+      , _fDefaultVal :: a
+      , _fReader     :: OptReader a
+      , _fActive     :: a
       }
 
 -- | Option for arguments (no long/short specifiers). Corresponds to
@@ -67,7 +67,7 @@
       { _aHelp       :: Maybe String
       , _aMetavar    :: Maybe String
       , _aEnvVar     :: Maybe String
-      , _aDefault    :: Maybe a
+      , _aDefaultVal :: Maybe a
       , _aDefaultStr :: Maybe String
       , _aReader     :: OptReader a
       }
diff --git a/src/Options/Harg/Util.hs b/src/Options/Harg/Util.hs
--- a/src/Options/Harg/Util.hs
+++ b/src/Options/Harg/Util.hs
@@ -45,8 +45,10 @@
       = Compose
       $ Const
       <$> opt
-            { _optDefault = Just mempty
-            , _optReader  = pure . const mempty
+            { _optDefaultVal
+                = Just mempty
+            , _optReader
+                = pure . const mempty
             , _optType
                 = case _optType opt of
                     OptionOptType   -> OptionOptType
