diff --git a/CHANGES.markdown b/CHANGES.markdown
--- a/CHANGES.markdown
+++ b/CHANGES.markdown
@@ -1,3 +1,6 @@
+## Changes in 0.3.1
+ - `Functor`, `Applicative`, and `Monad` instances for `First` and `Last`
+
 ## Changes in 0.3.0
  - `Show` instance for `Fingerprint`
  - `Data.Orphans` is now `Trustworthy`
diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -16,6 +16,7 @@
  * Added `Applicative` and `Alternative` instances for `ReadP` and `ReadPrec`
  * Added `Eq` and `Ord` instances for `Control.Exception.ErrorCall`
  * Added `Eq`, `Ord`, `Read`, and `Show` instances for data types in `GHC.Generics`
+ * Added `Functor`, `Applicative`, and `Monad` instances for `First` and `Last`
  * Added `Monoid`, `Eq`, `Ord`, `Read`, and `Show` instances for `Const`
  * Added `Read` and `Show` instances for `Down`
  * Added `Eq`, `Ord`, `Read`, and `Show` instances for `ZipList`
diff --git a/base-orphans.cabal b/base-orphans.cabal
--- a/base-orphans.cabal
+++ b/base-orphans.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:                base-orphans
-version:             0.3.0
+version:             0.3.1
 synopsis:            Backwards-compatible orphan instances for base
 homepage:            https://github.com/haskell-compat/base-orphans#readme
 bug-reports:         https://github.com/haskell-compat/base-orphans/issues
diff --git a/src/Data/Orphans.hs b/src/Data/Orphans.hs
--- a/src/Data/Orphans.hs
+++ b/src/Data/Orphans.hs
@@ -243,26 +243,18 @@
 instance Traversable ((,) a) where
     traverse f (x, y) = (,) x <$> f y
 
-instance Monoid a => Monoid (Const a b) where
-    mempty = Const mempty
-    mappend (Const a) (Const b) = Const (mappend a b)
-
+deriving instance Monoid a => Monoid (Const a b)
 deriving instance Eq ErrorCall
 deriving instance Ord ErrorCall
 deriving instance Num a => Num (Sum a)
 deriving instance Num a => Num (Product a)
 deriving instance Data Version
-
 -- GHC Trac #8218
-instance Monad m => Monad (WrappedMonad m) where
-    return = WrapMonad . return
-    a >>= f = WrapMonad (unwrapMonad a >>= unwrapMonad . f)
-
+deriving instance Monad m => Monad (WrappedMonad m)
 deriving instance Eq a => Eq (ZipList a)
 deriving instance Ord a => Ord (ZipList a)
 deriving instance Read a => Read (ZipList a)
 deriving instance Show a => Show (ZipList a)
-
 deriving instance Functor ArgOrder
 deriving instance Functor OptDescr
 deriving instance Functor ArgDescr
@@ -1161,6 +1153,13 @@
 instance Show a => Show (Const a b) where
     showsPrec d (Const x) = showParen (d > 10) $
                             showString "Const " . showsPrec 11 x
+
+deriving instance Functor First
+deriving instance Applicative First
+deriving instance Monad First
+deriving instance Functor Last
+deriving instance Applicative Last
+deriving instance Monad Last
 
 -- The actual constraint in base-4.8.0.0 doesn't include RealFloat a, but it
 -- is needed in previous versions of base due to Complex having lots of
