diff --git a/read-env-var.cabal b/read-env-var.cabal
--- a/read-env-var.cabal
+++ b/read-env-var.cabal
@@ -1,5 +1,5 @@
 name:                read-env-var
-version:             0.1.0.0
+version:             0.1.0.1
 synopsis:            Functions for safely reading environment variables.
 description:         Please see README.md
 homepage:            https://github.com/cdepillabout/read-env-var#readme
diff --git a/src/System/ReadEnvVar.hs b/src/System/ReadEnvVar.hs
--- a/src/System/ReadEnvVar.hs
+++ b/src/System/ReadEnvVar.hs
@@ -14,6 +14,7 @@
 module System.ReadEnvVar
     ( readEnvVar
     , readEnvVarDef
+    , lookupEnvDef
     ) where
 
 #if __GLASGOW_HASKELL__ < 710
@@ -23,6 +24,7 @@
 #endif
 
 import Data.Maybe (fromMaybe)
+import Data.String (IsString(fromString))
 import System.Environment (lookupEnv)
 import Text.Read (readMaybe)
 
@@ -30,12 +32,20 @@
 -- 'readMaybe'.  If the environment variable doesn't exist, or it can't be
 -- 'read', use the default value.
 --
+-- Note that this does not read string values as one would expect.
+--
 -- >>> import System.Environment (setEnv)
--- >>> setEnv "TEST_ENV_VAR" "1000"
--- >>> readEnvVarDef "TEST_ENV_VAR" 5 :: IO Int
+-- >>> setEnv "TEST_ENV_VAR1" "1000"
+-- >>> readEnvVarDef "TEST_ENV_VAR1" 5 :: IO Int
 -- 1000
 -- >>> readEnvVarDef "THIS_ENV_VAR_WILL_NOT_EXIST" 5 :: IO Int
 -- 5
+-- >>> setEnv "TEST_ENV_VAR2" "some string 1"
+-- >>> readEnvVarDef "TEST_ENV_VAR2" "def val" :: IO String
+-- "def val"
+-- >>> setEnv "TEST_ENV_VAR3" "\"some string 1\""
+-- >>> readEnvVarDef "TEST_ENV_VAR3" "def val" :: IO String
+-- "some string 1"
 readEnvVarDef :: Read a
               => String -- ^ environment variable to lookup
               -> a      -- ^ default value to use if the environment variable
@@ -46,17 +56,36 @@
 -- | Lookup a value from an environment variable and read it in with
 -- 'readMaybe'.
 --
+-- Note that this does not read string values as one would expect.
+--
 -- >>> import System.Environment (setEnv)
 -- >>> setEnv "TEST_ENV_VAR" "2000"
 -- >>> readEnvVar "TEST_ENV_VAR" :: IO (Maybe Int)
 -- Just 2000
 -- >>> readEnvVar "THIS_ENV_VAR_WILL_NOT_EXIST" :: IO (Maybe Int)
 -- Nothing
+-- >>> setEnv "TEST_ENV_VAR2" "some string 1"
+-- >>> readEnvVar "TEST_ENV_VAR2" :: IO (Maybe String)
+-- Nothing
+-- >>> setEnv "TEST_ENV_VAR3" "\"some string 1\""
+-- >>> readEnvVar "TEST_ENV_VAR3" :: IO (Maybe String)
+-- Just "some string 1"
 readEnvVar :: Read a
            => String       -- ^ environment variable to lookup
            -> IO (Maybe a)
-readEnvVar envVar = do
-    maybeEnvVal <- lookupEnv envVar
-    case maybeEnvVal of
-        Nothing -> return Nothing
-        Just envVal -> return $ readMaybe envVal
+readEnvVar = fmap (>>= readMaybe) . lookupEnv
+
+-- | Like 'lookupEnv' but take a default value.
+--
+-- >>> import System.Environment (setEnv)
+-- >>> setEnv "TEST_ENV_VAR" "foo"
+-- >>> lookupEnvDef "TEST_ENV_VAR" "bar" :: IO String
+-- "foo"
+-- >>> lookupEnvDef "THIS_ENV_VAR_WILL_NOT_EXIST" "bar" :: IO String
+-- "bar"
+lookupEnvDef :: IsString a
+             => String  -- ^ environment variable to lookup
+             -> a       -- ^ default value to use if environment variable not defined
+             -> IO a
+lookupEnvDef envVar defaultValue =
+    pure . maybe defaultValue fromString =<< lookupEnv envVar
