diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 0.3.21
+
+* Reimplemented Functor & Applicative for LoggingT & NoLoggingT [#125](https://github.com/kazu-yamamoto/logger/issues/125) [#126](https://github.com/kazu-yamamoto/logger/pull/126)
+
 ## 0.3.20.2
 
 * Support for GHC 8.2
diff --git a/Control/Monad/Logger.hs b/Control/Monad/Logger.hs
--- a/Control/Monad/Logger.hs
+++ b/Control/Monad/Logger.hs
@@ -364,13 +364,25 @@
 -- Since 0.2.4
 newtype NoLoggingT m a = NoLoggingT { runNoLoggingT :: m a }
 
+#if __GLASGOW_HASKELL__ < 710
 instance Monad m => Functor (NoLoggingT m) where
     fmap = liftM
 
 instance Monad m => Applicative (NoLoggingT m) where
     pure = return
     (<*>) = ap
+#else
+instance Functor m => Functor (NoLoggingT m) where
+    fmap f = NoLoggingT . fmap f . runNoLoggingT
+    {-# INLINE fmap #-}
 
+instance Applicative m => Applicative (NoLoggingT m) where
+    pure = NoLoggingT . pure
+    {-# INLINE pure #-}
+    f <*> a = NoLoggingT (runNoLoggingT f <*> runNoLoggingT a)
+    {-# INLINE (<*>) #-}
+#endif
+
 instance Monad m => Monad (NoLoggingT m) where
     return = NoLoggingT . return
     NoLoggingT ma >>= f = NoLoggingT $ ma >>= runNoLoggingT . f
@@ -452,12 +464,26 @@
 -- Since 0.2.2
 newtype LoggingT m a = LoggingT { runLoggingT :: (Loc -> LogSource -> LogLevel -> LogStr -> IO ()) -> m a }
 
+#if __GLASGOW_HASKELL__ < 710
 instance Monad m => Functor (LoggingT m) where
     fmap = liftM
 
 instance Monad m => Applicative (LoggingT m) where
     pure = return
     (<*>) = ap
+#else
+instance Functor m => Functor (LoggingT m) where
+    fmap f logger = LoggingT $ \loggerFn -> fmap f $ (runLoggingT logger) loggerFn
+    {-# INLINE fmap #-}
+
+instance Applicative m => Applicative (LoggingT m) where
+    pure = LoggingT . const . pure
+    {-# INLINE pure #-}
+    loggerF <*> loggerA = LoggingT $ \loggerFn ->
+                                       (runLoggingT loggerF) loggerFn
+                                       <*> (runLoggingT loggerA) loggerFn
+    {-# INLINE (<*>) #-}
+#endif
 
 instance Monad m => Monad (LoggingT m) where
     return = LoggingT . const . return
diff --git a/monad-logger.cabal b/monad-logger.cabal
--- a/monad-logger.cabal
+++ b/monad-logger.cabal
@@ -1,5 +1,5 @@
 name:                monad-logger
-version:             0.3.20.2
+version:             0.3.21
 synopsis:            A class of monads which can log messages.
 description:         Hackage documentation generation is not reliable. For up to date documentation, please see: <http://www.stackage.org/package/monad-logger>.
 homepage:            https://github.com/kazu-yamamoto/logger
