diff --git a/envy.cabal b/envy.cabal
--- a/envy.cabal
+++ b/envy.cabal
@@ -1,5 +1,5 @@
 name:                envy
-version:             2.0.0.0
+version:             2.1.0.0
 synopsis:            An environmentally friendly way to deal with environment variables
 license:             BSD3
 license-file:        LICENSE
diff --git a/examples/Test.hs b/examples/Test.hs
--- a/examples/Test.hs
+++ b/examples/Test.hs
@@ -13,10 +13,10 @@
   defConfig = PGConfig "localhost" 5432
 
 instance FromEnv PGConfig where
-  fromEnv = fromEnvCustom (Option 7 "PG")
+  fromEnv = gFromEnvCustom (Option 7 "PG")
   -- Generically creates instance for retrieving environment variables (PG_HOST, PG_PORT)
 
 main :: IO ()
 main =
-  print =<< decodeEnv :: IO (Either String PGConfig)
+  print =<< (decodeEnv :: IO (Either String PGConfig))
  -- PGConfig { pgHost = "foobah", pgPort = 5432 }
diff --git a/src/System/Envy.hs b/src/System/Envy.hs
--- a/src/System/Envy.hs
+++ b/src/System/Envy.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE DeriveGeneric              #-}
 {-# LANGUAGE RecordWildCards            #-}
+{-# LANGUAGE StandaloneDeriving         #-}
 {-# LANGUAGE TypeOperators              #-}
 {-# LANGUAGE FlexibleContexts           #-}
 {-# LANGUAGE MultiParamTypeClasses      #-}
@@ -67,6 +68,8 @@
        , envMaybe
        , (.=)
        , (.!=)
+         -- * Utility Types
+       , ReadShowVar (..)
          -- * Generics
        , DefConfig (..)
        , Option (..)
@@ -77,8 +80,11 @@
 ------------------------------------------------------------------------------
 import           Control.Applicative
 import           Control.Monad.Except
+import           Control.Monad.Fail
 import           Control.Exception
+import           Data.Functor.Identity
 import           Data.Maybe
+import           Data.Monoid
 import           Data.Char
 import           Data.Time
 import           GHC.Generics
@@ -98,6 +104,9 @@
   deriving ( Functor, Monad, Applicative, MonadError String
            , MonadIO, Alternative, MonadPlus )
 
+instance MonadFail Parser where
+  fail = Parser . throwError
+
 ------------------------------------------------------------------------------
 -- | Variable type, smart constructor for handling environment variables.
 data EnvVar = EnvVar {
@@ -310,6 +319,19 @@
   fromVar "" = Nothing
   fromVar  s = Just <$> fromVar s
 
+------------------------------------------------------------------------------
+deriving instance (Var a, Typeable a) => Var (Last a)
+deriving instance (Var a, Typeable a) => Var (First a)
+deriving instance (Var a, Typeable a) => Var (Identity a)
+
+------------------------------------------------------------------------------
+-- | A utility type to use any instance of 'Read' and 'Show' as an instance of
+--   'Var'.
+newtype ReadShowVar a = ReadShowVar { unReadShowVar :: a }
+
+instance (Typeable a, Show a, Read a) => Var (ReadShowVar a) where
+  toVar = show . unReadShowVar
+  fromVar = fmap ReadShowVar . readMaybe
 ------------------------------------------------------------------------------
 -- | Environment retrieval with failure info
 decodeEnv :: FromEnv a => IO (Either String a)
