diff --git a/Data/Array.hs b/Data/Array.hs
index a65e2fc21285e4031f9900f63756309c0ce84453..6b632fd2b5f4df134a4dec50d16a0127773e3df1 100644
--- a/Data/Array.hs
+++ b/Data/Array.hs
@@ -54,8 +54,6 @@ module Data.Array (
   ) where
 
 import Data.Ix
-import Data.Typeable ()
-
 import GHC.Arr  -- Most of the hard work is done here
 
 {- $intro
diff --git a/Data/Array/Base.hs b/Data/Array/Base.hs
index 8cc319cacceb3785019e877e24b2eab7061cb7aa..80e91eaa5c4a05ec923ad10f52ecbbcca7d725d7 100644
--- a/Data/Array/Base.hs
+++ b/Data/Array/Base.hs
@@ -1,5 +1,15 @@
-{-# LANGUAGE BangPatterns, CPP, RankNTypes, MagicHash, UnboxedTuples, MultiParamTypeClasses, FlexibleInstances, FlexibleContexts, DeriveDataTypeable, UnliftedFFITypes #-}
-{-# LANGUAGE RoleAnnotations #-}
+{-# LANGUAGE
+    BangPatterns
+  , CPP
+  , RankNTypes
+  , MagicHash
+  , UnboxedTuples
+  , MultiParamTypeClasses
+  , FlexibleInstances
+  , FlexibleContexts
+  , UnliftedFFITypes
+  , RoleAnnotations
+ #-}
 {-# OPTIONS_HADDOCK hide #-}
 
 -----------------------------------------------------------------------------
@@ -39,7 +49,6 @@ import GHC.Word         ( Word8(..), Word16(..), Word32(..), Word64(..) )
 import GHC.IO           ( stToIO )
 import GHC.IOArray      ( IOArray(..),
                           newIOArray, unsafeReadIOArray, unsafeWriteIOArray )
-import Data.Typeable
 
 #include "MachDeps.h"
 
@@ -398,7 +407,6 @@ instance IArray Arr.Array e where
 -- "Data.Array.Unboxed" instead of "Data.Array").
 --
 data UArray i e = UArray !i !i !Int ByteArray#
-                  deriving Typeable
 -- There are class-based invariants on both parameters. See also #9220.
 type role UArray nominal nominal
 
@@ -979,7 +987,6 @@ instance MArray (STArray s) e (Lazy.ST s) where
 -- don\'t use 'STUArray' if you require the non-strictness that
 -- 'STArray' provides.
 data STUArray s i e = STUArray !i !i !Int (MutableByteArray# s)
-                      deriving Typeable
 -- The "ST" parameter must be nominal for the safety of the ST trick.
 -- The other parameters have class constraints. See also #9220.
 type role STUArray nominal nominal nominal
@@ -1370,11 +1377,7 @@ freeze marr = do
   -- use the safe array creation function here.
   return (listArray (l,u) es)
 
-#if __GLASGOW_HASKELL__ >= 711
 freezeSTUArray :: STUArray s i e -> ST s (UArray i e)
-#else
-freezeSTUArray :: Ix i => STUArray s i e -> ST s (UArray i e)
-#endif
 freezeSTUArray (STUArray l u n marr#) = ST $ \s1# ->
     case sizeofMutableByteArray# marr#  of { n# ->
     case newByteArray# n# s1#           of { (# s2#, marr'# #) ->
@@ -1449,11 +1452,7 @@ thaw arr = case bounds arr of
               | i <- [0 .. n - 1]]
     return marr
 
-#if __GLASGOW_HASKELL__ >= 711
 thawSTUArray :: UArray i e -> ST s (STUArray s i e)
-#else
-thawSTUArray :: Ix i => UArray i e -> ST s (STUArray s i e)
-#endif
 thawSTUArray (UArray l u n arr#) = ST $ \s1# ->
     case sizeofByteArray# arr#          of { n# ->
     case newByteArray# n# s1#           of { (# s2#, marr# #) ->
@@ -1513,11 +1512,7 @@ unsafeThaw :: (Ix i, IArray a e, MArray b e m) => a i e -> m (b i e)
 unsafeThaw = thaw
 
 {-# INLINE unsafeThawSTUArray #-}
-#if __GLASGOW_HASKELL__ >= 711
 unsafeThawSTUArray :: UArray i e -> ST s (STUArray s i e)
-#else
-unsafeThawSTUArray :: Ix i => UArray i e -> ST s (STUArray s i e)
-#endif
 unsafeThawSTUArray (UArray l u n marr#) =
     return (STUArray l u n (unsafeCoerce# marr#))
 
@@ -1527,11 +1522,7 @@ unsafeThawSTUArray (UArray l u n marr#) =
     #-}
 
 {-# INLINE unsafeThawIOArray #-}
-#if __GLASGOW_HASKELL__ >= 711
 unsafeThawIOArray :: Arr.Array ix e -> IO (IOArray ix e)
-#else
-unsafeThawIOArray :: Ix ix => Arr.Array ix e -> IO (IOArray ix e)
-#endif
 unsafeThawIOArray arr = stToIO $ do
     marr <- ArrST.unsafeThawSTArray arr
     return (IOArray marr)
@@ -1540,11 +1531,7 @@ unsafeThawIOArray arr = stToIO $ do
 "unsafeThaw/IOArray"  unsafeThaw = unsafeThawIOArray
     #-}
 
-#if __GLASGOW_HASKELL__ >= 711
 thawIOArray :: Arr.Array ix e -> IO (IOArray ix e)
-#else
-thawIOArray :: Ix ix => Arr.Array ix e -> IO (IOArray ix e)
-#endif
 thawIOArray arr = stToIO $ do
     marr <- ArrST.thawSTArray arr
     return (IOArray marr)
@@ -1553,11 +1540,7 @@ thawIOArray arr = stToIO $ do
 "thaw/IOArray"  thaw = thawIOArray
     #-}
 
-#if __GLASGOW_HASKELL__ >= 711
 freezeIOArray :: IOArray ix e -> IO (Arr.Array ix e)
-#else
-freezeIOArray :: Ix ix => IOArray ix e -> IO (Arr.Array ix e)
-#endif
 freezeIOArray (IOArray marr) = stToIO (ArrST.freezeSTArray marr)
 
 {-# RULES
@@ -1565,11 +1548,7 @@ freezeIOArray (IOArray marr) = stToIO (ArrST.freezeSTArray marr)
     #-}
 
 {-# INLINE unsafeFreezeIOArray #-}
-#if __GLASGOW_HASKELL__ >= 711
 unsafeFreezeIOArray :: IOArray ix e -> IO (Arr.Array ix e)
-#else
-unsafeFreezeIOArray :: Ix ix => IOArray ix e -> IO (Arr.Array ix e)
-#endif
 unsafeFreezeIOArray (IOArray marr) = stToIO (ArrST.unsafeFreezeSTArray marr)
 
 {-# RULES
diff --git a/Data/Array/IO/Internals.hs b/Data/Array/IO/Internals.hs
index c9738e93de28c882e96daabdb463ca07af9e4813..2b12e36c6ca9c3b68af0dba047334a3b1ce34611 100644
--- a/Data/Array/IO/Internals.hs
+++ b/Data/Array/IO/Internals.hs
@@ -1,6 +1,8 @@
-{-# LANGUAGE DeriveDataTypeable, FlexibleInstances, MultiParamTypeClasses,
-             CPP #-}
-{-# LANGUAGE RoleAnnotations #-}
+{-# LANGUAGE
+    FlexibleInstances
+  , MultiParamTypeClasses
+  , RoleAnnotations
+ #-}
 
 {-# OPTIONS_HADDOCK hide #-}
 -----------------------------------------------------------------------------
@@ -27,15 +29,11 @@ module Data.Array.IO.Internals (
 
 import Data.Int
 import Data.Word
-import Data.Typeable
 
 import Control.Monad.ST         ( RealWorld, stToIO )
 import Foreign.Ptr              ( Ptr, FunPtr )
 import Foreign.StablePtr        ( StablePtr )
 
-#if __GLASGOW_HASKELL__ < 711
-import Data.Ix
-#endif
 import Data.Array.Base
 
 import GHC.IOArray (IOArray(..))
@@ -52,7 +50,6 @@ import GHC.IOArray (IOArray(..))
 --    are supported: see "Data.Array.MArray" for a list of instances.
 --
 newtype IOUArray i e = IOUArray (STUArray RealWorld i e)
-                       deriving Typeable
 -- Both parameters have class-based invariants. See also #9220.
 type role IOUArray nominal nominal
 
@@ -374,11 +371,7 @@ castIOUArray (IOUArray marr) = stToIO $ do
     return (IOUArray marr')
 
 {-# INLINE unsafeThawIOUArray #-}
-#if __GLASGOW_HASKELL__ >= 711
 unsafeThawIOUArray :: UArray ix e -> IO (IOUArray ix e)
-#else
-unsafeThawIOUArray :: Ix ix => UArray ix e -> IO (IOUArray ix e)
-#endif
 unsafeThawIOUArray arr = stToIO $ do
     marr <- unsafeThawSTUArray arr
     return (IOUArray marr)
@@ -387,11 +380,7 @@ unsafeThawIOUArray arr = stToIO $ do
 "unsafeThaw/IOUArray" unsafeThaw = unsafeThawIOUArray
     #-}
 
-#if __GLASGOW_HASKELL__ >= 711
 thawIOUArray :: UArray ix e -> IO (IOUArray ix e)
-#else
-thawIOUArray :: Ix ix => UArray ix e -> IO (IOUArray ix e)
-#endif
 thawIOUArray arr = stToIO $ do
     marr <- thawSTUArray arr
     return (IOUArray marr)
@@ -401,22 +390,14 @@ thawIOUArray arr = stToIO $ do
     #-}
 
 {-# INLINE unsafeFreezeIOUArray #-}
-#if __GLASGOW_HASKELL__ >= 711
 unsafeFreezeIOUArray :: IOUArray ix e -> IO (UArray ix e)
-#else
-unsafeFreezeIOUArray :: Ix ix => IOUArray ix e -> IO (UArray ix e)
-#endif
 unsafeFreezeIOUArray (IOUArray marr) = stToIO (unsafeFreezeSTUArray marr)
 
 {-# RULES
 "unsafeFreeze/IOUArray" unsafeFreeze = unsafeFreezeIOUArray
     #-}
 
-#if __GLASGOW_HASKELL__ >= 711
 freezeIOUArray :: IOUArray ix e -> IO (UArray ix e)
-#else
-freezeIOUArray :: Ix ix => IOUArray ix e -> IO (UArray ix e)
-#endif
 freezeIOUArray (IOUArray marr) = stToIO (freezeSTUArray marr)
 
 {-# RULES
diff --git a/Data/Array/ST.hs b/Data/Array/ST.hs
index 0a8ff0d3fa10166e5d686347e118798429584bfb..dccc4dca4a07e1f2f5bfc35daf876389c376ea57 100644
--- a/Data/Array/ST.hs
+++ b/Data/Array/ST.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE RankNTypes #-}
 -----------------------------------------------------------------------------
 -- |
@@ -38,11 +37,7 @@ import GHC.Arr          ( STArray, Array, unsafeFreezeSTArray )
 -- the array before returning it - it uses 'unsafeFreeze' internally, but
 -- this wrapper is a safe interface to that function.
 --
-#if __GLASGOW_HASKELL__ >= 711
 runSTArray :: (forall s . ST s (STArray s i e)) -> Array i e
-#else
-runSTArray :: Ix i => (forall s . ST s (STArray s i e)) -> Array i e
-#endif
 runSTArray st = runST (st >>= unsafeFreezeSTArray)
 
 -- | A safe way to create and work with an unboxed mutable array before
@@ -51,11 +46,7 @@ runSTArray st = runST (st >>= unsafeFreezeSTArray)
 -- 'unsafeFreeze' internally, but this wrapper is a safe interface to
 -- that function.
 --
-#if __GLASGOW_HASKELL__ >= 711
 runSTUArray :: (forall s . ST s (STUArray s i e)) -> UArray i e
-#else
-runSTUArray :: Ix i => (forall s . ST s (STUArray s i e)) -> UArray i e
-#endif
 runSTUArray st = runST (st >>= unsafeFreezeSTUArray)
 
 
diff --git a/array.cabal b/array.cabal
index ceaf54dae5934885cd1a882449fa75cc1e3607d5..6491adefad9ed0e82137b904611b740000a04722 100644
--- a/array.cabal
+++ b/array.cabal
@@ -9,7 +9,7 @@ synopsis:      Mutable and immutable arrays
 category:      Data Structures
 build-type:    Simple
 cabal-version: >=1.10
-tested-with:   GHC==8.2.1, GHC==8.0.2, GHC==7.10.3, GHC==7.8.4
+tested-with:   GHC==8.4.1, GHC==8.2.1, GHC==8.0.2
 description:
     In addition to providing the "Data.Array" module
     <http://www.haskell.org/onlinereport/haskell2010/haskellch14.html as specified in the Haskell 2010 Language Report>,
@@ -28,7 +28,6 @@ library
   other-extensions:
       BangPatterns,
       CPP,
-      DeriveDataTypeable,
       FlexibleContexts,
       FlexibleInstances,
       MagicHash,
@@ -37,7 +36,7 @@ library
       Trustworthy,
       UnboxedTuples,
       UnliftedFFITypes
-  build-depends: base >= 4.7 && < 4.12
+  build-depends: base >= 4.9 && < 4.12
   ghc-options: -Wall
   exposed-modules:
       Data.Array
diff --git a/changelog.md b/changelog.md
index e537cd068b9ea297ac9f81387abcbf2862ecc3fa..1a480a4100bc7b759bf92808876a8271916e9d92 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,10 @@
 # Changelog for [`array` package](http://hackage.haskell.org/package/array)
 
+## Next
+
+  * Bundled with GHC 8.6.1
+  * Drop support for GHC versions prior to GHC 8.0
+
 ## 0.5.2.0  *Jul 2017*
 
   * Bundled with GHC 8.2.1