diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,11 @@
+## [v1.3.1.3](https://github.com/diagrams/diagrams-lib/tree/v1.3.1.3) (2016-06-05)
+
+- allow `base-4.9`
+- allow `data-default-class-0.1`
+- test with GHC 8.0.1
+
+[Full Changelog](https://github.com/diagrams/diagrams-lib/compare/v1.3.1.2...v1.3.1.3)
+
 ## [v1.3.1.2](https://github.com/diagrams/diagrams-lib/tree/v1.3.1.2) (2016-05-01)
 
 - allow `lens-4.14`
diff --git a/diagrams-lib.cabal b/diagrams-lib.cabal
--- a/diagrams-lib.cabal
+++ b/diagrams-lib.cabal
@@ -1,5 +1,5 @@
 Name:                diagrams-lib
-Version:             1.3.1.2
+Version:             1.3.1.3
 Synopsis:            Embedded domain-specific language for declarative graphics
 Description:         Diagrams is a flexible, extensible EDSL for creating
                      graphics of many types.  Graphics can be created
@@ -99,7 +99,7 @@
                        Diagrams.TwoD.Types,
                        Diagrams.TwoD.Vector,
                        Diagrams.Util
-  Build-depends:       base >= 4.2 && < 4.9,
+  Build-depends:       base >= 4.2 && < 4.10,
                        containers >= 0.3 && < 0.6,
                        array >= 0.3 && < 0.6,
                        semigroups >= 0.3.4 && < 0.19,
@@ -109,7 +109,7 @@
                        diagrams-solve >= 0.1 && < 0.2,
                        active >= 0.2 && < 0.3,
                        colour >= 2.3.2 && < 2.4,
-                       data-default-class < 0.1,
+                       data-default-class < 0.2,
                        fingertree >= 0.1 && < 0.2,
                        intervals >= 0.7 && < 0.8,
                        lens >= 4.6 && < 4.15,
@@ -121,13 +121,13 @@
                        linear >= 1.20.1 && < 1.21,
                        adjunctions >= 4.0 && < 5.0,
                        distributive >=0.2.2 && < 1.0,
-                       process >= 1.1 && < 1.3,
+                       process >= 1.1 && < 1.5,
                        fsnotify >= 0.2.1 && < 0.3,
                        directory >= 1.2 && < 1.3,
                        unordered-containers >= 0.2 && < 0.3,
                        text >= 0.7.1 && < 1.3,
                        mtl >= 2.0 && < 2.3,
-                       transformers >= 0.3.0 && < 0.5.0,
+                       transformers >= 0.3.0 && < 0.6.0,
                        exceptions >= 0.6 && < 1.0
   if impl(ghc < 7.6)
     Build-depends: ghc-prim
@@ -146,7 +146,7 @@
   main-is: Test.hs
   other-modules: Diagrams.TwoD.OffsetTest
   hs-source-dirs: test
-  build-depends:       base >= 4.2 && < 4.9,
+  build-depends:       base >= 4.2 && < 4.10,
                        tasty >= 0.10,
                        tasty-hunit >= 0.9.2,
                        diagrams-lib
diff --git a/src/Diagrams/Align.hs b/src/Diagrams/Align.hs
--- a/src/Diagrams/Align.hs
+++ b/src/Diagrams/Align.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE ConstrainedClassMethods     #-}
 {-# LANGUAGE FlexibleContexts     #-}
 {-# LANGUAGE TypeFamilies         #-}
 {-# LANGUAGE UndecidableInstances #-}
diff --git a/src/Diagrams/Animation.hs b/src/Diagrams/Animation.hs
--- a/src/Diagrams/Animation.hs
+++ b/src/Diagrams/Animation.hs
@@ -93,7 +93,7 @@
 --
 --   See also 'animRect' for help constructing a background to go
 --   behind an animation.
-animEnvelope :: (Backend b v n, OrderedField n, Metric v, Monoid' m)
+animEnvelope :: (OrderedField n, Metric v, Monoid' m)
            => QAnimation b v n m -> QAnimation b v n m
 animEnvelope = animEnvelope' 30
 
@@ -101,7 +101,7 @@
 --   parameter is the number of samples per time unit to use.  Lower
 --   rates will be faster but less accurate; higher rates are more
 --   accurate but slower.
-animEnvelope' :: (Backend b v n, OrderedField n, Metric v, Monoid' m)
+animEnvelope' :: (OrderedField n, Metric v, Monoid' m)
             => Rational -> QAnimation b v n m -> QAnimation b v n m
 animEnvelope' r a = withEnvelope (simulate r a) <$> a
 
@@ -112,7 +112,7 @@
 --
 --   Uses 30 samples per time unit by default; to adjust this number
 --   see 'animRect''.
-animRect :: (InSpace V2 n t, Num n, Monoid' m, TrailLike t, Enveloped t, Transformable t, Monoid t)
+animRect :: (InSpace V2 n t, Monoid' m, TrailLike t, Enveloped t, Transformable t, Monoid t)
          => QAnimation b V2 n m -> t
 animRect = animRect' 30
 
@@ -120,7 +120,7 @@
 --   parameter is the number of samples per time unit to use.  Lower
 --   rates will be faster but less accurate; higher rates are more
 --   accurate but slower.
-animRect' :: (InSpace V2 n t, Num n, Monoid' m, TrailLike t, Enveloped t, Transformable t, Monoid t)
+animRect' :: (InSpace V2 n t, Monoid' m, TrailLike t, Enveloped t, Transformable t, Monoid t)
           => Rational -> QAnimation b V2 n m -> t
 animRect' r anim
     | null results = rect 1 1
diff --git a/src/Diagrams/Attributes.hs b/src/Diagrams/Attributes.hs
--- a/src/Diagrams/Attributes.hs
+++ b/src/Diagrams/Attributes.hs
@@ -129,10 +129,10 @@
 newtype LineWidth n = LineWidth (Last n)
   deriving (Typeable, Semigroup)
 
-_LineWidth :: (Typeable n, OrderedField n) => Iso' (LineWidth n) n
+_LineWidth :: Iso' (LineWidth n) n
 _LineWidth = iso getLineWidth (LineWidth . Last)
 
-_LineWidthM :: (Typeable n, OrderedField n) => Iso' (LineWidthM n) (Measure n)
+_LineWidthM :: Iso' (LineWidthM n) (Measure n)
 _LineWidthM = mapping _LineWidth
 
 instance Typeable n => AttributeClass (LineWidth n)
@@ -166,7 +166,7 @@
 lwN = lw . normalized
 
 -- | A convenient synonym for 'lineWidth (output w)'.
-lwO :: (N a ~ n, HasStyle a, Typeable n, Num n) => n -> a -> a
+lwO :: (N a ~ n, HasStyle a, Typeable n) => n -> a -> a
 lwO = lw . output
 
 -- | A convenient sysnonym for 'lineWidth (local w)'.
@@ -181,7 +181,7 @@
 -- | Lens onto the unmeasured linewith attribute. This is useful for
 --   backends to use on styles once they have been unmeasured. Using on
 --   a diagram style could lead to unexpected results.
-_lineWidthU :: (Typeable n, OrderedField n) => Lens' (Style v n) (Maybe n)
+_lineWidthU :: Typeable n => Lens' (Style v n) (Maybe n)
 _lineWidthU = atAttr . mapping _LineWidth
 
 ------------------------------------------------------------------------
@@ -219,7 +219,7 @@
 dashingN w v = dashing (map normalized w) (normalized v)
 
 -- | A convenient synonym for 'dashing (output w)'.
-dashingO :: (N a ~ n, HasStyle a, Typeable n, Num n) => [n] -> n -> a -> a
+dashingO :: (N a ~ n, HasStyle a, Typeable n) => [n] -> n -> a -> a
 dashingO w v = dashing (map output w) (output v)
 
 -- | A convenient sysnonym for 'dashing (local w)'.
@@ -227,14 +227,14 @@
 dashingL w v = dashing (map local w) (local v)
 
 -- | Lens onto a measured dashing attribute in a style.
-_dashing :: (Typeable n, OrderedField n)
+_dashing :: Typeable n
          => Lens' (Style v n) (Maybe (Measured n (Dashing n)))
 _dashing = atMAttr
 
 -- | Lens onto the unmeasured 'Dashing' attribute. This is useful for
 --   backends to use on styles once they have been unmeasured. Using on
 --   a diagram style could lead to unexpected results.
-_dashingU :: (Typeable n, OrderedField n) => Lens' (Style v n) (Maybe (Dashing n))
+_dashingU :: Typeable n => Lens' (Style v n) (Maybe (Dashing n))
 _dashingU = atAttr
 
 ------------------------------------------------------------------------
diff --git a/src/Diagrams/Backend/CmdLine.hs b/src/Diagrams/Backend/CmdLine.hs
--- a/src/Diagrams/Backend/CmdLine.hs
+++ b/src/Diagrams/Backend/CmdLine.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE ConstrainedClassMethods     #-}
 {-# LANGUAGE DeriveDataTypeable        #-}
 {-# LANGUAGE FlexibleContexts          #-}
 {-# LANGUAGE FlexibleInstances         #-}
@@ -462,7 +463,7 @@
 -- | This instance allows functions resulting in something that is 'Mainable' to
 --   be 'Mainable'.  It takes a parse of collected arguments and applies them to
 --   the given function producing the 'Mainable' result.
-instance (Parseable (Args (a -> d)), ToResult d, Mainable (ResultOf d))
+instance (ToResult d, Mainable (ResultOf d))
         => Mainable (a -> d) where
   type MainOpts (a -> d) = (MainOpts (ResultOf (a -> d)), Args (a -> d))
 
diff --git a/src/Diagrams/BoundingBox.hs b/src/Diagrams/BoundingBox.hs
--- a/src/Diagrams/BoundingBox.hs
+++ b/src/Diagrams/BoundingBox.hs
@@ -113,7 +113,7 @@
 mapT :: (a -> b) -> (a, a) -> (b, b)
 mapT f (x, y) = (f x, f y)
 
-instance (Additive v, Num n, Ord n) => HasOrigin (BoundingBox v n) where
+instance (Additive v, Num n) => HasOrigin (BoundingBox v n) where
   moveOriginTo p b
     = fromMaybeEmpty
     (NonEmptyBoundingBox . mapT (moveOriginTo p) <$> getCorners b)
@@ -179,7 +179,7 @@
 fromPoints = mconcat . map fromPoint
 
 -- | Create a bounding box for any enveloped object (such as a diagram or path).
-boundingBox :: (InSpace v n a, HasBasis v, Num n, Enveloped a)
+boundingBox :: (InSpace v n a, HasBasis v, Enveloped a)
             => a -> BoundingBox v n
 boundingBox a = fromMaybeEmpty $ do
   env <- (appEnvelope . getEnvelope) a
@@ -197,7 +197,7 @@
 getCorners (BoundingBox p) = nonEmptyCorners <$> getOption p
 
 -- | Computes all of the corners of the bounding box.
-getAllCorners :: (Additive v, Traversable v, Num n) => BoundingBox v n -> [Point v n]
+getAllCorners :: (Additive v, Traversable v) => BoundingBox v n -> [Point v n]
 getAllCorners (BoundingBox (Option Nothing)) = []
 getAllCorners (BoundingBox (Option (Just (NonEmptyBoundingBox (l, u)))))
   = T.sequence (liftI2 (\a b -> [a,b]) l u)
@@ -213,13 +213,13 @@
 
 -- | Get the center of a the bounding box of an enveloped object, return
 --   'Nothing' for object with empty envelope.
-mCenterPoint :: (InSpace v n a, HasBasis v, Num n, Enveloped a)
+mCenterPoint :: (InSpace v n a, HasBasis v, Enveloped a)
             => a -> Maybe (Point v n)
 mCenterPoint = boxCenter . boundingBox
 
 -- | Get the center of a the bounding box of an enveloped object, return
 --   the origin for object with empty envelope.
-centerPoint :: (InSpace v n a, HasBasis v, Num n, Enveloped a)
+centerPoint :: (InSpace v n a, HasBasis v, Enveloped a)
             => a -> Point v n
 centerPoint = fromMaybe origin . mCenterPoint
 
@@ -238,7 +238,7 @@
 -- | Transforms an enveloped thing to fit within a @BoundingBox@.  If the
 --   bounding box is empty, then the result is also @mempty@.
 boxFit
-  :: (InSpace v n a, HasBasis v, Enveloped a, Transformable a, Monoid a, Num n)
+  :: (InSpace v n a, HasBasis v, Enveloped a, Transformable a, Monoid a)
   => BoundingBox v n -> a -> a
 boxFit b x = maybe mempty (`transform` x) $ boxTransform (boundingBox x) b
 
diff --git a/src/Diagrams/Combinators.hs b/src/Diagrams/Combinators.hs
--- a/src/Diagrams/Combinators.hs
+++ b/src/Diagrams/Combinators.hs
@@ -73,7 +73,7 @@
 --   >     )
 --   > c = circle 0.8
 --   > withEnvelopeEx = sqNewEnv # centerXY # pad 1.5
-withEnvelope :: (InSpace v n a, Metric v, OrderedField n, Monoid' m, Enveloped a)
+withEnvelope :: (InSpace v n a, Monoid' m, Enveloped a)
            => a -> QDiagram b v n m -> QDiagram b v n m
 withEnvelope = setEnvelope . getEnvelope
 
@@ -117,7 +117,7 @@
 --   <<diagrams/src_Diagrams_Combinators_strutEx.svg#diagram=strutEx&width=300>>
 --
 --   > strutEx = (circle 1 ||| strut unitX ||| circle 1) # centerXY # pad 1.1
-strut :: (Metric v, OrderedField n, Monoid' m)
+strut :: (Metric v, OrderedField n)
       => v n -> QDiagram b v n m
 strut v = QD $ D.leafU (inj . toDeletable $ env)
   where env = translate ((-0.5) *^ v) . getEnvelope $ straight v
diff --git a/src/Diagrams/Deform.hs b/src/Diagrams/Deform.hs
--- a/src/Diagrams/Deform.hs
+++ b/src/Diagrams/Deform.hs
@@ -92,7 +92,7 @@
 --   where
 --     (s1, s2) = splitAtParam s 0.5
 
-approx :: (Metric v, OrderedField n) => Deformation v u n -> FixedSegment v n -> FixedSegment u n
+approx :: Deformation v u n -> FixedSegment v n -> FixedSegment u n
 approx t (FLinear p0 p1)      = FLinear (deform t p0) (deform t p1)
 approx t (FCubic p0 c1 c2 p1) = FCubic (f p0) (f c1) (f c2) (f p1)
   where f = deform t
diff --git a/src/Diagrams/LinearMap.hs b/src/Diagrams/LinearMap.hs
--- a/src/Diagrams/LinearMap.hs
+++ b/src/Diagrams/LinearMap.hs
@@ -79,7 +79,7 @@
 -- so ghc knows there's only one possible result from calling vmap.
 
 -- | Apply a linear map.
-linmap :: (InSpace v n a, F.Foldable v, LinearMappable a b, N b ~ n)
+linmap :: (InSpace v n a, LinearMappable a b, N b ~ n)
      => LinearMap v (V b) n -> a -> b
 linmap = vmap . lapply
 
@@ -137,8 +137,7 @@
 mkAffineMap :: (v n -> u n) -> u n -> AffineMap v u n
 mkAffineMap f = AffineMap (LinearMap f)
 
-toAffineMap :: (HasBasis v, Num n)
-            => Transformation v n -> AffineMap v v n
+toAffineMap :: Transformation v n -> AffineMap v v n
 toAffineMap t = AffineMap (toLinearMap t) (transl t)
 
 class (LinearMappable a b, N a ~ N b) => AffineMappable a b where
@@ -155,7 +154,7 @@
 instance (Metric v, Metric u, OrderedField n, r ~ Trail' l u n) => AffineMappable (Trail' l v n) r
 instance (Metric v, Metric u, OrderedField n, r ~ Trail u n) => AffineMappable (Trail v n) r
 
-instance (Additive v, F.Foldable v, Num n, r ~ Point u n) => AffineMappable (Point v n) r where
+instance (Additive v, Num n, r ~ Point u n) => AffineMappable (Point v n) r where
   amap (AffineMap f v) p = linmap f p .+^ v
   {-# INLINE amap #-}
 
diff --git a/src/Diagrams/Parametric/Adjust.hs b/src/Diagrams/Parametric/Adjust.hs
--- a/src/Diagrams/Parametric/Adjust.hs
+++ b/src/Diagrams/Parametric/Adjust.hs
@@ -81,7 +81,7 @@
 -- | Adjust the length of a parametric object such as a segment or
 --   trail.  The second parameter is an option record which controls how
 --   the adjustment should be performed; see 'AdjustOpts'.
-adjust :: (V t ~ v, N t ~ n, DomainBounds t, Sectionable t, HasArcLength t, Fractional n)
+adjust :: (N t ~ n, Sectionable t, HasArcLength t, Fractional n)
        => t -> AdjustOpts n -> t
 adjust s opts = section s
   (if opts^.adjSide == End   then domainLower s else getParam s)
diff --git a/src/Diagrams/Path.hs b/src/Diagrams/Path.hs
--- a/src/Diagrams/Path.hs
+++ b/src/Diagrams/Path.hs
@@ -284,7 +284,7 @@
 
 -- | \"Explode\" a path by exploding every component trail (see
 --   'explodeTrail').
-explodePath :: (V t ~ v, N t ~ n, Additive v, TrailLike t) => Path v n -> [[t]]
+explodePath :: (V t ~ v, N t ~ n, TrailLike t) => Path v n -> [[t]]
 explodePath = map explodeTrail . op Path
 
 -- | Partition a path into two paths based on a predicate on trails:
diff --git a/src/Diagrams/Prelude.hs b/src/Diagrams/Prelude.hs
--- a/src/Diagrams/Prelude.hs
+++ b/src/Diagrams/Prelude.hs
@@ -1,4 +1,5 @@
 {-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# LANGUAGE CPP #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Diagrams.Prelude
@@ -78,11 +79,20 @@
 import           Diagrams
 
 import           Control.Applicative
+
+#if MIN_VERSION_lens(4,13,0)
 import           Control.Lens        hiding (argument, at, backwards, beside,
+                                      children, contains, indexed, indices,
+                                      inside, levels, none, outside, singular,
+                                      transform, ( # ), (...), (.>), (<.>))
+#else
+import           Control.Lens        hiding (argument, at, backwards, beside,
                                       children, coerce, contains, indexed,
                                       indices, inside, levels, none, outside,
                                       singular, transform, ( # ), (...), (.>),
                                       (<.>))
+#endif
+
 import           Data.Active
 import           Data.Colour         hiding (AffineSpace (..), atop, over)
 import           Data.Colour.Names   hiding (tan)
@@ -93,4 +103,3 @@
 import           Linear.Affine
 import           Linear.Metric
 import           Linear.Vector
-
diff --git a/src/Diagrams/Size.hs b/src/Diagrams/Size.hs
--- a/src/Diagrams/Size.hs
+++ b/src/Diagrams/Size.hs
@@ -98,7 +98,7 @@
 mkSizeSpec = dims . fmap (fromMaybe 0)
 
 -- | Make a 'SizeSpec' from a vector. Any negative values will be ignored.
-dims :: Functor v => v n -> SizeSpec v n
+dims :: v n -> SizeSpec v n
 dims = SizeSpec
 
 -- | A size spec with no hints to the size.
@@ -135,15 +135,15 @@
 
 -- | Uniformly scale any enveloped object so that it fits within the
 --   given size. For non-uniform scaling see 'boxFit'.
-sized :: (InSpace v n a, HasLinearMap v, HasBasis v, Transformable a, Enveloped a, Fractional n, Ord n)
+sized :: (InSpace v n a, HasLinearMap v, Transformable a, Enveloped a)
       => SizeSpec v n -> a -> a
 sized spec a = transform (requiredScaling spec (size a)) a
 
 -- | Uniformly scale an enveloped object so that it \"has the same
 --   size as\" (fits within the width and height of) some other
 --   object.
-sizedAs :: (InSpace v n a, SameSpace a b, HasLinearMap v, HasBasis v, Transformable a,
-            Enveloped a, Enveloped b, Fractional n, Ord n)
+sizedAs :: (InSpace v n a, SameSpace a b, HasLinearMap v, Transformable a,
+            Enveloped a, Enveloped b)
         => b -> a -> a
 sizedAs other = sized (dims $ size other)
 
diff --git a/src/Diagrams/ThreeD/Align.hs b/src/Diagrams/ThreeD/Align.hs
--- a/src/Diagrams/ThreeD/Align.hs
+++ b/src/Diagrams/ThreeD/Align.hs
@@ -46,8 +46,6 @@
 import           Diagrams.ThreeD.Vector
 import           Diagrams.TwoD.Align
 
-import           Linear.Vector
-
 -- | Translate the diagram along unitX so that all points have
 --   positive x-values.
 alignXMin :: (InSpace v n a, R1 v, Fractional n, Alignable a, HasOrigin a) => a -> a
@@ -106,7 +104,7 @@
 
 -- | See the documentation for 'alignZ'.
 snugZ :: (V a ~ v, N a ~ n, Alignable a, Traced a, HasOrigin a,
-          R3 v, Additive v, Fractional n) => n -> a -> a
+          R3 v, Fractional n) => n -> a -> a
 snugZ = snugBy unitZ
 
 
@@ -138,4 +136,3 @@
 
 snugCenterXYZ :: (InSpace v n a, R3 v, Fractional n, Alignable a, HasOrigin a, Traced a) => a -> a
 snugCenterXYZ = snugCenterX . snugCenterY . snugCenterZ
-
diff --git a/src/Diagrams/ThreeD/Camera.hs b/src/Diagrams/ThreeD/Camera.hs
--- a/src/Diagrams/ThreeD/Camera.hs
+++ b/src/Diagrams/ThreeD/Camera.hs
@@ -141,10 +141,10 @@
 -- aspect ratio of 4:3, for VGA and similar computer resolutions.
 mm50Narrow = PerspectiveLens (36 @@ deg) (27 @@ deg)
 
-camForward :: Fractional n => Camera l n -> Direction V3 n
+camForward :: Camera l n -> Direction V3 n
 camForward = direction . forward
 
-camUp :: Fractional n => Camera l n -> Direction V3 n
+camUp :: Camera l n -> Direction V3 n
 camUp = direction . up
 
 camRight :: Fractional n => Camera l n -> Direction V3 n
@@ -156,4 +156,3 @@
 
 camAspect :: (Floating n, CameraLens l) => Camera l n -> n
 camAspect = aspect . camLens
-
diff --git a/src/Diagrams/ThreeD/Light.hs b/src/Diagrams/ThreeD/Light.hs
--- a/src/Diagrams/ThreeD/Light.hs
+++ b/src/Diagrams/ThreeD/Light.hs
@@ -44,7 +44,7 @@
 instance Fractional n => Transformable (PointLight n) where
   transform t (PointLight p c) = PointLight (transform t p) c
 
-instance Fractional n => Transformable (ParallelLight n) where
+instance Transformable (ParallelLight n) where
   transform t (ParallelLight v c) = ParallelLight (transform t v) c
 
 -- | Construct a Diagram with a single PointLight at the origin, which
diff --git a/src/Diagrams/Trail.hs b/src/Diagrams/Trail.hs
--- a/src/Diagrams/Trail.hs
+++ b/src/Diagrams/Trail.hs
@@ -140,9 +140,7 @@
 type instance V (FingerTree m a) = V a
 type instance N (FingerTree m a) = N a
 
-instance ( Metric (V a), OrderedField (N a)
-         , FT.Measured m a, Transformable a
-         )
+instance (FT.Measured m a, Transformable a)
     => Transformable (FingerTree m a) where
   transform = FT.fmap' . transform
 
@@ -307,18 +305,14 @@
 --   extract the given measure for a trail and use it to compute a
 --   result.  Put another way, lift a function on a single measure
 --   (along with a default value) to a function on an entire trail.
-trailMeasure :: ( Metric v, OrderedField n
-                , SegMeasure v n :>: m, FT.Measured (SegMeasure v n) t
-                )
+trailMeasure :: ( SegMeasure v n :>: m, FT.Measured (SegMeasure v n) t )
              => a -> (m -> a) -> t -> a
 trailMeasure d f = option d f . get . FT.measure
 
 -- | Compute the number of segments of anything measured by
 --   'SegMeasure' (/e.g./ @SegMeasure@ itself, @Segment@, @SegTree@,
 --   @Trail@s...)
-numSegs :: ( OrderedField n, Num c, Metric v,
-             FT.Measured (SegMeasure v n) a
-           )
+numSegs :: (Num c, FT.Measured (SegMeasure v n) a)
         => a -> c
 numSegs = fromIntegral . trailMeasure 0 (getSum . op SegCount)
 
@@ -634,7 +628,7 @@
   domainLower (GetSegment t) = domainLower t
   domainUpper (GetSegment t) = domainUpper t
 
-instance (Metric v, OrderedField n, Real n)
+instance (Metric v, OrderedField n)
     => EndValues (GetSegment (Trail' Line v n)) where
   atStart (GetSegment (Line (SegTree ft)))
     = case FT.viewl ft of
@@ -1074,7 +1068,7 @@
 trailOffset = withLine lineOffset
 
 -- | Extract the offsets of the segments of a line.
-lineOffsets :: (Metric v, OrderedField n) => Trail' Line v n -> [v n]
+lineOffsets :: Trail' Line v n -> [v n]
 lineOffsets = map segOffset . lineSegments
 
 -- | Extract the offsets of the segments of a loop.
diff --git a/src/Diagrams/TrailLike.hs b/src/Diagrams/TrailLike.hs
--- a/src/Diagrams/TrailLike.hs
+++ b/src/Diagrams/TrailLike.hs
@@ -197,8 +197,7 @@
 --   >   # explodeTrail  -- generate a list of diagrams
 --   >   # zipWith lc [orange, green, yellow, red, blue]
 --   >   # mconcat # centerXY # pad 1.1
-explodeTrail :: (V t ~ v, N t ~ n, Additive v, TrailLike t) => Located (Trail v n) -> [t]
+explodeTrail :: (V t ~ v, N t ~ n, TrailLike t) => Located (Trail v n) -> [t]
 explodeTrail = map (mkTrail . fromFixedSeg) . fixTrail
   where
     mkTrail = trailLike . mapLoc (trailFromSegments . (:[]))
-
diff --git a/src/Diagrams/Transform.hs b/src/Diagrams/Transform.hs
--- a/src/Diagrams/Transform.hs
+++ b/src/Diagrams/Transform.hs
@@ -43,7 +43,7 @@
 -- | Conjugate one transformation by another. @conjugate t1 t2@ is the
 --   transformation which performs first @t1@, then @t2@, then the
 --   inverse of @t1@.
-conjugate :: (Additive v, Num n, Functor v)
+conjugate :: (Additive v, Num n)
           => Transformation v n -> Transformation v n -> Transformation v n
 conjugate t1 t2 = inv t1 <> t2 <> t1
 
diff --git a/src/Diagrams/Transform/Matrix.hs b/src/Diagrams/Transform/Matrix.hs
--- a/src/Diagrams/Transform/Matrix.hs
+++ b/src/Diagrams/Transform/Matrix.hs
@@ -13,9 +13,6 @@
 
 module Diagrams.Transform.Matrix where
 
-#if __GLASGOW_HASKELL__ < 710
-import           Control.Applicative
-#endif
 import           Control.Arrow           ((&&&))
 import           Control.Lens
 import           Data.Distributive
diff --git a/src/Diagrams/Transform/ScaleInv.hs b/src/Diagrams/Transform/ScaleInv.hs
--- a/src/Diagrams/Transform/ScaleInv.hs
+++ b/src/Diagrams/Transform/ScaleInv.hs
@@ -183,6 +183,6 @@
 --   scale-invariant things will be used only as \"decorations\" (/e.g./
 --   arrowheads) which should not affect the envelope, trace, and
 --   query.
-scaleInvPrim :: (V t ~ V2, N t ~ n, RealFloat n, Transformable t, Typeable t, Renderable t b, Monoid m)
+scaleInvPrim :: (V t ~ V2, N t ~ n, RealFloat n, Typeable t, Renderable t b, Monoid m)
              => t -> V2 n -> QDiagram b (V t) (N t) m
 scaleInvPrim t d = mkQD (Prim $ scaleInv t d) mempty mempty mempty mempty
diff --git a/src/Diagrams/TwoD/Arrow.hs b/src/Diagrams/TwoD/Arrow.hs
--- a/src/Diagrams/TwoD/Arrow.hs
+++ b/src/Diagrams/TwoD/Arrow.hs
@@ -253,7 +253,7 @@
 -- default style after all other styles have been applied.
 -- The semigroup stucture of the lw attribute will insure that the default
 -- is only used if it has not been set in @opts@.
-shaftSty :: Fractional n => ArrowOpts n -> Style V2 n
+shaftSty :: ArrowOpts n -> Style V2 n
 shaftSty opts = opts^.shaftStyle
 
 -- Set the default head style. See `shaftSty`.
diff --git a/src/Diagrams/TwoD/Arrowheads.hs b/src/Diagrams/TwoD/Arrowheads.hs
--- a/src/Diagrams/TwoD/Arrowheads.hs
+++ b/src/Diagrams/TwoD/Arrowheads.hs
@@ -197,7 +197,7 @@
     sz = max 1 ((len - jLength) / 1.5)
 
 -- | Make a side for the thorn head.
-curvedSide :: (Floating n, Ord n) => Angle n -> Segment Closed V2 n
+curvedSide :: Floating n => Angle n -> Segment Closed V2 n
 curvedSide theta = bezier3 ctrl1 ctrl2 end
   where
     v0    = unit_X
@@ -211,7 +211,7 @@
 lineHead :: RealFloat n => ArrowHT n
 lineHead s w = (square 1 # scaleX s # scaleY w # alignL, mempty)
 
-noHead :: (Floating n, Ord n) => ArrowHT n
+noHead :: ArrowHT n
 noHead _ _ = (mempty, mempty)
 
 -- | <<diagrams/src_Diagrams_TwoD_Arrowheads_triEx.svg#diagram=triEx&width=100>>
@@ -299,7 +299,7 @@
 lineTail :: RealFloat n => ArrowHT n
 lineTail s w = (square 1 # scaleY w # scaleX s # alignR, mempty)
 
-noTail :: OrderedField n => ArrowHT n
+noTail :: ArrowHT n
 noTail _ _ = (mempty, mempty)
 
 -- | <<diagrams/src_Diagrams_TwoD_Arrowheads_tri'Ex.svg#diagram=tri'Ex&width=100>>
diff --git a/src/Diagrams/TwoD/Attributes.hs b/src/Diagrams/TwoD/Attributes.hs
--- a/src/Diagrams/TwoD/Attributes.hs
+++ b/src/Diagrams/TwoD/Attributes.hs
@@ -420,11 +420,5 @@
 --   to loops.
 splitTextureFills
   :: forall b v n a. (
-#if __GLASGOW_HASKELL__ > 707
-                       Typeable v
-#else
-                       Typeable1 v
-#endif
-
-                     , Typeable n) => RTree b v n a -> RTree b v n a
+                     Typeable n) => RTree b v n a -> RTree b v n a
 splitTextureFills = splitAttr (FillTextureLoops :: FillTextureLoops n)
diff --git a/src/Diagrams/TwoD/Combinators.hs b/src/Diagrams/TwoD/Combinators.hs
--- a/src/Diagrams/TwoD/Combinators.hs
+++ b/src/Diagrams/TwoD/Combinators.hs
@@ -80,7 +80,7 @@
 --   combined diagram is the same as the local origin of the first.
 --   @(===)@ is associative and has 'mempty' as an identity.  See the
 --   documentation of 'beside' for more information.
-(===) :: (InSpace V2 n a, Num n, Juxtaposable a, Semigroup a) => a -> a -> a
+(===) :: (InSpace V2 n a, Juxtaposable a, Semigroup a) => a -> a -> a
 (===) = beside unit_Y
 
 -- | Place two diagrams (or other juxtaposable objects) horizontally
@@ -89,7 +89,7 @@
 --   is the same as the local origin of the first.  @(|||)@ is
 --   associative and has 'mempty' as an identity.  See the
 --   documentation of 'beside' for more information.
-(|||) :: (InSpace V2 n a, Num n, Juxtaposable a, Semigroup a) => a -> a -> a
+(|||) :: (InSpace V2 n a, Juxtaposable a, Semigroup a) => a -> a -> a
 (|||) = beside unitX
 
 -- | Lay out a list of juxtaposable objects in a row from left to right,
@@ -164,13 +164,13 @@
 -- | @strutX w@ is an empty diagram with width @w@, height 0, and a
 --   centered local origin.  Note that @strutX (-w)@ behaves the same as
 --   @strutX w@.
-strutX :: (Metric v, R1 v, OrderedField n, Monoid' m) => n -> QDiagram b v n m
+strutX :: (Metric v, R1 v, OrderedField n) => n -> QDiagram b v n m
 strutX d = strut (zero & _x .~ d)
 
 -- | @strutY h@ is an empty diagram with height @h@, width 0, and a
 --   centered local origin. Note that @strutY (-h)@ behaves the same as
 --   @strutY h@.
-strutY :: (Metric v, R2 v, OrderedField n, Monoid' m) => n -> QDiagram b v n m
+strutY :: (Metric v, R2 v, OrderedField n) => n -> QDiagram b v n m
 strutY d = strut (zero & _y .~ d)
 
 -- | @padX s@ \"pads\" a diagram in the x-direction, expanding its
@@ -263,4 +263,3 @@
 bgFrame :: (TypeableFloat n, Renderable (Path V2 n) b)
     => n -> Colour Double -> QDiagram b V2 n Any -> QDiagram b V2 n Any
 bgFrame f c d = d <> boundingRect (frame f d) # lwO 0 # fc c
-
diff --git a/src/Diagrams/TwoD/Ellipse.hs b/src/Diagrams/TwoD/Ellipse.hs
--- a/src/Diagrams/TwoD/Ellipse.hs
+++ b/src/Diagrams/TwoD/Ellipse.hs
@@ -35,18 +35,18 @@
 import           Diagrams.Util
 
 -- | A circle of radius 1, with center at the origin.
-unitCircle :: (TrailLike t, V t ~ V2, N t ~ n, RealFloat n) => t
+unitCircle :: (TrailLike t, V t ~ V2, N t ~ n) => t
 unitCircle = trailLike $ glueTrail (arcT xDir fullTurn) `at` p2 (1,0)
 
 -- | A circle of the given radius, centered at the origin.  As a path,
 --   it begins at (r,0).
-circle :: (TrailLike t, V t ~ V2, N t ~ n, RealFloat n, Transformable t) => n -> t
+circle :: (TrailLike t, V t ~ V2, N t ~ n, Transformable t) => n -> t
 circle d = unitCircle # scale d
 
 -- | @ellipse e@ constructs an ellipse with eccentricity @e@ by
 --   scaling the unit circle in the X direction.  The eccentricity must
 --   be within the interval [0,1).
-ellipse :: (TrailLike t, V t ~ V2, N t ~ n, RealFloat n, Transformable t) => n -> t
+ellipse :: (TrailLike t, V t ~ V2, N t ~ n, Transformable t) => n -> t
 ellipse e
     | e >= 0 && e < 1  = scaleX (sqrt (1 - e*e)) unitCircle
     | otherwise        = error "Eccentricity of ellipse must be >= 0 and < 1."
@@ -54,5 +54,5 @@
 -- | @ellipseXY x y@ creates an axis-aligned ellipse, centered at the
 --   origin, with radius @x@ along the x-axis and radius @y@ along the
 --   y-axis.
-ellipseXY :: (TrailLike t, V t ~ V2, N t ~ n, RealFloat n, Transformable t) => n -> n -> t
+ellipseXY :: (TrailLike t, V t ~ V2, N t ~ n, Transformable t) => n -> n -> t
 ellipseXY x y = unitCircle # scaleX x # scaleY y
diff --git a/src/Diagrams/TwoD/Offset.hs b/src/Diagrams/TwoD/Offset.hs
--- a/src/Diagrams/TwoD/Offset.hs
+++ b/src/Diagrams/TwoD/Offset.hs
@@ -337,7 +337,7 @@
 -- >   where
 -- >     c = hexagon 5
 
-withTrailL :: (OrderedField n) => (Located (Trail' Line V2 n) -> r) -> (Located (Trail' Loop V2 n) -> r) -> Located (Trail V2 n) -> r
+withTrailL :: (Located (Trail' Line V2 n) -> r) -> (Located (Trail' Loop V2 n) -> r) -> Located (Trail V2 n) -> r
 withTrailL f g l = withTrail (f . (`at` p)) (g . (`at` p)) (unLoc l)
   where
     p = loc l
diff --git a/src/Diagrams/TwoD/Path.hs b/src/Diagrams/TwoD/Path.hs
--- a/src/Diagrams/TwoD/Path.hs
+++ b/src/Diagrams/TwoD/Path.hs
@@ -404,7 +404,7 @@
 --   trace consists of those parts of the original diagram's trace
 --   which fall within the clipping path, or parts of the path's trace
 --   within the original diagram.
-clipTo :: (TypeableFloat n, Renderable (Path V2 n) b)
+clipTo :: TypeableFloat n
   => Path V2 n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
 clipTo p d = setTrace intersectionTrace . toEnvelope $ clipBy p d
   where
@@ -425,7 +425,7 @@
 
 -- | Clip a diagram to the clip path taking the envelope and trace of the clip
 --   path.
-clipped :: (TypeableFloat n, Renderable (Path V2 n) b)
+clipped :: TypeableFloat n
   => Path V2 n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
 clipped p = withTrace p . withEnvelope p . clipBy p
 
diff --git a/src/Diagrams/TwoD/Polygons.hs b/src/Diagrams/TwoD/Polygons.hs
--- a/src/Diagrams/TwoD/Polygons.hs
+++ b/src/Diagrams/TwoD/Polygons.hs
@@ -180,7 +180,7 @@
             NoOrient     -> mempty
 
 -- | Generate the polygon described by the given options.
-polygon :: (InSpace V2 n t, TrailLike t, OrderedField n) => PolygonOpts n -> t
+polygon :: (InSpace V2 n t, TrailLike t) => PolygonOpts n -> t
 polygon = trailLike . polyTrail
 
 -- | Generate the located trail of a polygon specified by polar data
diff --git a/src/Diagrams/TwoD/Shapes.hs b/src/Diagrams/TwoD/Shapes.hs
--- a/src/Diagrams/TwoD/Shapes.hs
+++ b/src/Diagrams/TwoD/Shapes.hs
@@ -87,7 +87,7 @@
 --   oriented parallel to the axes.
 --
 --   <<diagrams/src_Diagrams_TwoD_Shapes_unitSquareEx.svg#diagram=unitSquareEx&width=100>>
-unitSquare :: (InSpace V2 n t, TrailLike t, OrderedField n) => t
+unitSquare :: (InSpace V2 n t, TrailLike t) => t
 unitSquare = polygon (def & polyType   .~ PolyRegular 4 (sqrt 2 / 2)
                           & polyOrient .~ OrientH)
 
@@ -97,7 +97,7 @@
 --   length, oriented parallel to the axes.
 --
 --   <<diagrams/src_Diagrams_TwoD_Shapes_squareEx.svg#diagram=squareEx&width=200>>
-square :: (InSpace V2 n t, TrailLike t, OrderedField n) => n -> t
+square :: (InSpace V2 n t, TrailLike t) => n -> t
 square d = rect d d
 
 -- > squareEx = hcat' (with & sep .~ 0.5) [square 1, square 2, square 3]
@@ -107,7 +107,7 @@
 --   @h@, centered at the origin.
 --
 --   <<diagrams/src_Diagrams_TwoD_Shapes_rectEx.svg#diagram=rectEx&width=150>>
-rect :: (InSpace V2 n t, TrailLike t, OrderedField n) => n -> n -> t
+rect :: (InSpace V2 n t, TrailLike t) => n -> n -> t
 rect w h = trailLike . head . op Path $ unitSquare # scaleX w # scaleY h
 
 -- > rectEx = rect 1 0.7 # pad 1.1
@@ -139,7 +139,7 @@
 --   polygons of a given /radius/).
 --
 --   The polygon will be oriented with one edge parallel to the x-axis.
-regPoly :: (InSpace V2 n t, TrailLike t, OrderedField n) => Int -> n -> t
+regPoly :: (InSpace V2 n t, TrailLike t) => Int -> n -> t
 regPoly n l = polygon (def & polyType .~
                                PolySides
                                  (repeat (1/fromIntegral n @@ turn))
@@ -159,76 +159,76 @@
 -- > dodecagonEx  = shapeEx dodecagon
 
 -- | A synonym for 'triangle', provided for backwards compatibility.
-eqTriangle :: (InSpace V2 n t, TrailLike t, OrderedField n) => n -> t
+eqTriangle :: (InSpace V2 n t, TrailLike t) => n -> t
 eqTriangle = triangle
 
 -- | An equilateral triangle, with sides of the given length and base
 --   parallel to the x-axis.
 --
 --   <<diagrams/src_Diagrams_TwoD_Shapes_triangleEx.svg#diagram=triangleEx&width=100>>
-triangle :: (InSpace V2 n t, TrailLike t, OrderedField n) => n -> t
+triangle :: (InSpace V2 n t, TrailLike t) => n -> t
 triangle = regPoly 3
 
 -- | A regular pentagon, with sides of the given length and base
 --   parallel to the x-axis.
 --
 --   <<diagrams/src_Diagrams_TwoD_Shapes_pentagonEx.svg#diagram=pentagonEx&width=100>>
-pentagon :: (InSpace V2 n t, TrailLike t, OrderedField n) => n -> t
+pentagon :: (InSpace V2 n t, TrailLike t) => n -> t
 pentagon = regPoly 5
 
 -- | A regular hexagon, with sides of the given length and base
 --   parallel to the x-axis.
 --
 --   <<diagrams/src_Diagrams_TwoD_Shapes_hexagonEx.svg#diagram=hexagonEx&width=100>>
-hexagon :: (InSpace V2 n t, TrailLike t, OrderedField n) => n -> t
+hexagon :: (InSpace V2 n t, TrailLike t) => n -> t
 hexagon = regPoly 6
 
 -- | A regular heptagon, with sides of the given length and base
 --   parallel to the x-axis.
 --
 --   <<diagrams/src_Diagrams_TwoD_Shapes_heptagonEx.svg#diagram=heptagonEx&width=100>>
-heptagon :: (InSpace V2 n t, TrailLike t, OrderedField n) => n -> t
+heptagon :: (InSpace V2 n t, TrailLike t) => n -> t
 heptagon = regPoly 7
 
 -- | A synonym for 'heptagon'.  It is, however, completely inferior,
 --   being a base admixture of the Latin /septum/ (seven) and the
 --   Greek γωνία (angle).
-septagon :: (InSpace V2 n t, TrailLike t, OrderedField n) => n -> t
+septagon :: (InSpace V2 n t, TrailLike t) => n -> t
 septagon = heptagon
 
 -- | A regular octagon, with sides of the given length and base
 --   parallel to the x-axis.
 --
 --   <<diagrams/src_Diagrams_TwoD_Shapes_octagonEx.svg#diagram=octagonEx&width=100>>
-octagon :: (InSpace V2 n t, TrailLike t, OrderedField n) => n -> t
+octagon :: (InSpace V2 n t, TrailLike t) => n -> t
 octagon = regPoly 8
 
 -- | A regular nonagon, with sides of the given length and base
 --   parallel to the x-axis.
 --
 --   <<diagrams/src_Diagrams_TwoD_Shapes_nonagonEx.svg#diagram=nonagonEx&width=100>>
-nonagon :: (InSpace V2 n t, TrailLike t, OrderedField n) => n -> t
+nonagon :: (InSpace V2 n t, TrailLike t) => n -> t
 nonagon = regPoly 9
 
 -- | A regular decagon, with sides of the given length and base
 --   parallel to the x-axis.
 --
 --   <<diagrams/src_Diagrams_TwoD_Shapes_decagonEx.svg#diagram=decagonEx&width=100>>
-decagon :: (InSpace V2 n t, TrailLike t, OrderedField n) => n -> t
+decagon :: (InSpace V2 n t, TrailLike t) => n -> t
 decagon = regPoly 10
 
 -- | A regular hendecagon, with sides of the given length and base
 --   parallel to the x-axis.
 --
 --   <<diagrams/src_Diagrams_TwoD_Shapes_hendecagonEx.svg#diagram=hendecagonEx&width=100>>
-hendecagon :: (InSpace V2 n t, TrailLike t, OrderedField n) => n -> t
+hendecagon :: (InSpace V2 n t, TrailLike t) => n -> t
 hendecagon = regPoly 11
 
 -- | A regular dodecagon, with sides of the given length and base
 --   parallel to the x-axis.
 --
 --   <<diagrams/src_Diagrams_TwoD_Shapes_dodecagonEx.svg#diagram=dodecagonEx&width=100>>
-dodecagon :: (InSpace V2 n t, TrailLike t, OrderedField n) => n -> t
+dodecagon :: (InSpace V2 n t, TrailLike t) => n -> t
 dodecagon = regPoly 12
 
 ------------------------------------------------------------
diff --git a/src/Diagrams/TwoD/Text.hs b/src/Diagrams/TwoD/Text.hs
--- a/src/Diagrams/TwoD/Text.hs
+++ b/src/Diagrams/TwoD/Text.hs
@@ -193,7 +193,7 @@
 font = applyAttr . Font . Last
 
 -- | Lens onto the font name of a style.
-_font :: (Typeable n, OrderedField n) => Lens' (Style v n) (Maybe String)
+_font :: Lens' (Style v n) (Maybe String)
 _font = atAttr . mapping _Font
 
 --------------------------------------------------
@@ -248,7 +248,7 @@
 fontSizeN = fontSize . normalized
 
 -- | A convenient synonym for 'fontSize (Output w)'.
-fontSizeO :: (N a ~ n, Typeable n, Num n, HasStyle a) => n -> a -> a
+fontSizeO :: (N a ~ n, Typeable n, HasStyle a) => n -> a -> a
 fontSizeO = fontSize . output
 
 -- | A convenient sysnonym for 'fontSize (Local w)'.
@@ -256,7 +256,7 @@
 fontSizeL = fontSize . local
 
 -- | Apply a 'FontSize' attribute.
-fontSizeM :: (N a ~ n, Typeable n, Num n, HasStyle a) => FontSizeM n -> a -> a
+fontSizeM :: (N a ~ n, Typeable n, HasStyle a) => FontSizeM n -> a -> a
 fontSizeM = applyMAttr
 
 recommendFontSize :: (N a ~ n, Typeable n, HasStyle a) => Measure n -> a -> a
@@ -270,7 +270,7 @@
 _fontSize :: (Typeable n, OrderedField n) => Lens' (Style v n) (Measure n)
 _fontSize = _fontSizeR . mapping committed
 
-_fontSizeU :: (Typeable n, OrderedField n) => Lens' (Style v n) (Maybe n)
+_fontSizeU :: (Typeable n) => Lens' (Style v n) (Maybe n)
 _fontSizeU = atAttr . mapping (_FontSize . committed)
 
 --------------------------------------------------
@@ -302,7 +302,7 @@
 fontSlant = applyAttr
 
 -- | Lens onto the font slant in a style.
-_fontSlant :: (Typeable n, OrderedField n) => Lens' (Style v n) FontSlant
+_fontSlant :: Lens' (Style v n) FontSlant
 _fontSlant = atAttr . non def
 
 -- | Set all text in italics.
@@ -347,5 +347,5 @@
 bold = fontWeight FontWeightBold
 
 -- | Lens onto the font weight in a style.
-_fontWeight :: (Typeable n, OrderedField n) => Lens' (Style v n) FontWeight
+_fontWeight :: Lens' (Style v n) FontWeight
 _fontWeight = atAttr . non def
