diff --git a/numhask-range.cabal b/numhask-range.cabal
--- a/numhask-range.cabal
+++ b/numhask-range.cabal
@@ -1,9 +1,11 @@
--- This file has been generated from package.yaml by hpack version 0.18.1.
+-- This file has been generated from package.yaml by hpack version 0.20.0.
 --
 -- see: https://github.com/sol/hpack
+--
+-- hash: 18003f857cbb0ea73a97f0e023bddf802e171ba3f01574bd3d203588fe2449f9
 
 name:           numhask-range
-version:        0.1.3.0
+version:        0.2.0.0
 synopsis:       Numbers that are range representations
 description:    Numbers that represent ranges of all sorts.
 category:       project
@@ -28,14 +30,15 @@
 library
   hs-source-dirs:
       src
-  default-extensions: DeriveGeneric DeriveTraversable FlexibleContexts InstanceSigs MultiParamTypeClasses NegativeLiterals NoImplicitPrelude OverloadedStrings PatternSynonyms TypeFamilies UnicodeSyntax
+  default-extensions: NegativeLiterals NoImplicitPrelude OverloadedStrings UnicodeSyntax
+  ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
   build-depends:
-      numhask >=0.1.3
-    , base >=4.7 && <4.11
-    , protolude
-    , QuickCheck
+      QuickCheck
     , adjunctions
+    , base >=4.7 && <4.12
     , distributive
+    , numhask-prelude >=0.0.1.0
+    , protolude
     , semigroupoids
   exposed-modules:
       NumHask.Space
@@ -52,11 +55,14 @@
   main-is: test.hs
   hs-source-dirs:
       test
-  default-extensions: DeriveGeneric DeriveTraversable FlexibleContexts InstanceSigs MultiParamTypeClasses NegativeLiterals NoImplicitPrelude OverloadedStrings PatternSynonyms TypeFamilies UnicodeSyntax
+  default-extensions: NegativeLiterals NoImplicitPrelude OverloadedStrings UnicodeSyntax
+  ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
   build-depends:
-      numhask >=0.1.3
-    , base >=4.7 && <5
+      base >=4.7 && <5
     , doctest
+    , numhask-prelude >=0.0.1.0
     , numhask-range
     , tasty
+  other-modules:
+      Paths_numhask_range
   default-language: Haskell2010
diff --git a/readme.md b/readme.md
--- a/readme.md
+++ b/readme.md
@@ -12,7 +12,9 @@
 
 If you ask yourself what a chart is, sifting through the cruft of accumulated practice, nomenclature and usage, digging deep for charting's essence, and if you ask the question in haskell, here's the simplest object you find:
 
-[![unitSquare](https://tonyday567.github.io/other/unitSquare.svg)](https://tonyday567.github.io/other/unitSquare.svg)
+
+
+[![unitSquare](other/src_Diagrams_TwoD_Shapes_unitSquareEx.svg)](other/src_Diagrams_TwoD_Shapes_unitSquareEx.svg)
 
 To a first approximation, charting is transforming and placing this unit on a physical XY plane, such as a screen, or on graph paper.  A rectangle is a distended square; a line is a very thin rectangle; a histogram is a series of rectangles, and axes are nothing more than a collection of squares. The main thing on a chart that isn't a square is text, but even then we use square pixels to render.
 
diff --git a/src/NumHask/Pair.hs b/src/NumHask/Pair.hs
--- a/src/NumHask/Pair.hs
+++ b/src/NumHask/Pair.hs
@@ -119,9 +119,12 @@
 instance Traversable1 Pair where
   traverse1 f (Pair a b) = Pair <$> f a Data.Functor.Apply.<.> f b
 
+instance (Semigroup a) => Semigroup (Pair a) where
+  (Pair a0 b0) <> (Pair a1 b1) = Pair (a0 <> a1) (b0 <> b1)
+
 instance (Monoid a) => Monoid (Pair a) where
   mempty = Pair mempty mempty
-  (Pair a0 b0) `mappend` (Pair a1 b1) = Pair (a0 `mappend` a1) (b0 `mappend` b1)
+  mappend = (<>)
 
 instance Distributive Pair where
   collect f x = Pair (getL . f <$> x) (getR . f <$> x)
@@ -191,7 +194,7 @@
   sign (Pair a b) = Pair (sign a) (sign b)
   abs (Pair a b) = Pair (abs a) (abs b)
 
-instance (ExpField a, AdditiveGroup a, MultiplicativeUnital a) =>
+instance (ExpField a, MultiplicativeUnital a) =>
          Normed (Pair a) a where
   size (Pair a b) = sqrt (a ** (one + one) + b ** (one + one))
 
diff --git a/src/NumHask/Range.hs b/src/NumHask/Range.hs
--- a/src/NumHask/Range.hs
+++ b/src/NumHask/Range.hs
@@ -152,20 +152,20 @@
 half = one / two
 
 -- | convex hull union
-instance (FromInteger a, Ord a, BoundedField a) => AdditiveMagma (Range a) where
+instance (Ord a) => AdditiveMagma (Range a) where
     plus (Range l0 u0) (Range l1 u1) = Range (min l0 l1) (max u0 u1) 
 
-instance (FromInteger a, Ord a, BoundedField a) => AdditiveUnital (Range a) where
+instance (Ord a, BoundedField a) => AdditiveUnital (Range a) where
     zero = Range infinity neginfinity
 
-instance (FromInteger a, Ord a, BoundedField a) => AdditiveAssociative (Range a)
+instance (Ord a) => AdditiveAssociative (Range a)
 
-instance (FromInteger a, Ord a, BoundedField a) => AdditiveInvertible (Range a) where
+instance (Ord a) => AdditiveInvertible (Range a) where
     negate (Range l u) = Range u l
 
-instance (FromInteger a, Ord a, BoundedField a) => AdditiveCommutative (Range a)
-instance (FromInteger a, Ord a, BoundedField a) => Additive (Range a)
-instance (FromInteger a, Ord a, BoundedField a) => AdditiveGroup (Range a)
+instance (Ord a) => AdditiveCommutative (Range a)
+instance (Ord a, BoundedField a) => Additive (Range a)
+instance (Ord a, BoundedField a) => AdditiveGroup (Range a)
 
 -- | times may well be some sort of affine projection lurking under the hood
 instance (FromInteger a, Ord a, BoundedField a) => MultiplicativeMagma (Range a) where
@@ -208,7 +208,7 @@
         | u' < l = l - u'
         | otherwise = zero
 
-instance (BoundedField a, Ord a, FromInteger a, Epsilon a) => Epsilon (Range a) where
+instance (BoundedField a, Ord a, Epsilon a) => Epsilon (Range a) where
     nearZero (Range l u) = nearZero (l - u)
     aboutEqual (Range l u) (Range l' u')= aboutEqual l l' && aboutEqual u u'
 
@@ -228,7 +228,7 @@
     upper (Range _ u) = u
     singleton a = Range a a
     type Grid (Range a) = Int
-    grid :: FromInteger a => Pos -> Range a -> Int -> [a]
+    grid :: Pos -> Range a -> Int -> [a]
     grid o s n = (+ if o==MidPos then step/(one+one) else zero) <$> posns
       where
         posns = (lower s +) . (step *) . fromIntegral <$> [i0..i1]
@@ -243,13 +243,16 @@
       where
         ps = grid OuterPos r n
 
+instance (Ord a, BoundedField a, FromInteger a) => Semigroup (Range a) where
+    (<>) = union
+
 instance (Ord a, BoundedField a, FromInteger a) => Monoid (Range a) where
     mempty = nul
-    mappend = union
+    mappend = (<>)
 
 -- | turn a range into n `a`s pleasing to human sense and sensibility
 -- the `a`s may well lie outside the original range as a result
-gridSensible :: (Fractional a, Ord a, FromInteger a, QuotientField a, ExpField a) =>
+gridSensible :: (FromInteger a, Fractional a, Ord a, QuotientField a, ExpField a) =>
     Pos -> Range a -> Int -> [a]
 gridSensible tp (Range l u) n =
     (+ if tp==MidPos then step/two else zero) <$> posns
diff --git a/src/NumHask/RangeD.hs b/src/NumHask/RangeD.hs
--- a/src/NumHask/RangeD.hs
+++ b/src/NumHask/RangeD.hs
@@ -1,7 +1,11 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveFoldable #-}
+{-# LANGUAGE DeriveFunctor #-}
 {-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DeriveTraversable #-}
 {-# LANGUAGE ExtendedDefaultRules #-}
+{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE InstanceSigs #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
diff --git a/src/NumHask/Rect.hs b/src/NumHask/Rect.hs
--- a/src/NumHask/Rect.hs
+++ b/src/NumHask/Rect.hs
@@ -103,56 +103,56 @@
 instance Traversable1 Rect where
   traverse1 f (Rect a b c d) = Rect <$> f a <.> f b <.> f c <.> f d
 
-instance (Ord a, BoundedField a, FromInteger a) =>
+instance (Ord a) =>
          AdditiveMagma (Rect a) where
   plus (Ranges x0 y0) (Ranges x1 y1) = Ranges (x0 `plus` x1) (y0 `plus` y1)
 
-instance (Ord a, BoundedField a, FromInteger a) =>
+instance (Ord a, BoundedField a) =>
          AdditiveUnital (Rect a) where
   zero = Ranges zero zero
 
-instance (Ord a, FromInteger a, BoundedField a) =>
+instance (Ord a) =>
          AdditiveAssociative (Rect a)
 
-instance (Ord a, BoundedField a, FromInteger a) =>
+instance (Ord a) =>
          AdditiveCommutative (Rect a)
 
-instance (Ord a, FromInteger a, BoundedField a) =>
+instance (Ord a) =>
          AdditiveIdempotent (Rect a)
 
-instance (Ord a, BoundedField a, FromInteger a) => Additive (Rect a)
+instance (Ord a, BoundedField a) => Additive (Rect a)
 
-instance (Ord a, FromInteger a, BoundedField a) =>
+instance (Ord a) =>
          AdditiveInvertible (Rect a) where
   negate (Ranges x y) = Ranges (negate x) (negate y)
 
-instance (Ord a, BoundedField a, FromInteger a) =>
+instance (Ord a, BoundedField a) =>
          AdditiveGroup (Rect a)
 
-instance (Ord a, BoundedField a, FromInteger a) =>
+instance (FromInteger a, Ord a, BoundedField a) =>
          MultiplicativeMagma (Rect a) where
   times (Ranges x0 y0) (Ranges x1 y1) = Ranges (x0 `times` x1) (y0 `times` y1)
 
-instance (Ord a, BoundedField a, FromInteger a) =>
+instance (FromInteger a, Ord a, BoundedField a) =>
          MultiplicativeUnital (Rect a) where
   one = Ranges one one
 
-instance (Ord a, FromInteger a, BoundedField a) =>
+instance (FromInteger a, Ord a, BoundedField a) =>
          MultiplicativeAssociative (Rect a)
 
-instance (Ord a, BoundedField a, FromInteger a) =>
+instance (FromInteger a, Ord a, BoundedField a) =>
          MultiplicativeCommutative (Rect a)
 
-instance (Ord a, BoundedField a, FromInteger a) => Multiplicative (Rect a)
+instance (FromInteger a, Ord a, BoundedField a) => Multiplicative (Rect a)
 
-instance (Ord a, FromInteger a, BoundedField a) =>
+instance (FromInteger a, Ord a, BoundedField a) =>
          MultiplicativeInvertible (Rect a) where
   recip (Ranges x y) = Ranges (recip x) (recip y)
 
-instance (Ord a, BoundedField a, FromInteger a) =>
+instance (FromInteger a, Ord a, BoundedField a) =>
          MultiplicativeGroup (Rect a)
 
-instance (AdditiveInvertible a, BoundedField a, Ord a, FromInteger a) =>
+instance (FromInteger a, AdditiveInvertible a, BoundedField a, Ord a) =>
          Signed (Rect a) where
   sign (Ranges l u) = Ranges (sign l) (sign u)
   abs (Ranges l u) = Ranges (sign l * l) (sign u * u)
@@ -160,7 +160,7 @@
 instance (AdditiveGroup a) => Normed (Rect a) (Pair a) where
   size (Ranges l u) = Pair (size l) (size u)
 
-instance (BoundedField a, Ord a, FromInteger a, Epsilon a) => Epsilon (Rect a) where
+instance (BoundedField a, Ord a, Epsilon a) => Epsilon (Rect a) where
     nearZero (Ranges a b) = nearZero a && nearZero b
     aboutEqual (Ranges a b) (Ranges a' b')= aboutEqual a a' && aboutEqual b b'
 
@@ -182,7 +182,7 @@
   index (Rect _ _ c _) (True, False) = c
   index (Rect _ _ _ d) (True, True) = d
 
-instance (Signed a, FromInteger a, Ord a, BoundedField a) => Space (Rect a) where
+instance (FromInteger a, Signed a, Ord a, BoundedField a) => Space (Rect a) where
   type Element (Rect a) = Pair a
   nul = Ranges nul nul
   union (Ranges a b) (Ranges c d) = Ranges (a `union` c) (b `union` d)
@@ -190,7 +190,7 @@
   upper (Rect _ u0 _ u1) = Pair u0 u1
   singleton (Pair x y) = Rect x x y y
   type Grid (Rect a) = Pair Int
-  grid :: (FromInteger a) => Pos -> Rect a -> Pair Int -> [Pair a]
+  grid :: Pos -> Rect a -> Pair Int -> [Pair a]
   grid o s n =
     (+ if o == MidPos
          then step / (one + one)
@@ -217,9 +217,12 @@
       sx = width rX / fromIntegral stepX
       sy = width rY / fromIntegral stepY
 
-instance (Signed a, Ord a, BoundedField a, FromInteger a) => Monoid (Rect a) where
+instance (FromInteger a, Signed a, Ord a, BoundedField a) => Semigroup (Rect a) where
+  (<>) = union
+
+instance (FromInteger a, Signed a, Ord a, BoundedField a) => Monoid (Rect a) where
   mempty = nul
-  mappend = union
+  mappend = (<>)
 
 instance (Arbitrary a) => Arbitrary (Rect a) where
     arbitrary = do
@@ -231,12 +234,12 @@
   rnf (Ranges a b) = rnf a `seq` rnf b
 
 -- | create a list of pairs representing the lower left and upper right cormners of a rectangle.
-corners :: (Signed a, FromInteger a, BoundedField a, Ord a) => Rect a -> [Pair a]
+corners :: (FromInteger a, Signed a, BoundedField a, Ord a) => Rect a -> [Pair a]
 corners r = [lower r, upper r]
 
 -- | project a Rect from an old range to a new one
 projectRect ::
-     (Signed a, FromInteger a, Ord a, BoundedField a)
+     (FromInteger a, Signed a, Ord a, BoundedField a)
   => Rect a
   -> Rect a
   -> Rect a
diff --git a/src/NumHask/Space.hs b/src/NumHask/Space.hs
--- a/src/NumHask/Space.hs
+++ b/src/NumHask/Space.hs
@@ -1,5 +1,8 @@
 {-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE UndecidableInstances #-}
 {-# OPTIONS_GHC -Wall #-}
 #if ( __GLASGOW_HASKELL__ < 820 )
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -1,6 +1,8 @@
-resolver: nightly-2017-12-27
+resolver: nightly-2018-04-05
 
 packages:
   - .
 
-extra-deps: []
+extra-deps:
+  - numhask-prelude-0.0.1.0
+  - numhask-0.2.0.0
diff --git a/test/test.hs b/test/test.hs
--- a/test/test.hs
+++ b/test/test.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE NoImplicitPrelude #-}
 {-# OPTIONS_GHC -Wall #-}
 {-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
@@ -56,11 +57,7 @@
      , Signed (Element s)
      , Ord (Element s)
      , Normed s (Element s)
-     , Signed s
      , Space s
-     , Epsilon s
-     , Eq s
-     , Multiplicative s
      )
   => Element s
   -> [Law2 s (Element s)]
@@ -84,14 +81,11 @@
   ]
 
 additiveSpaceFuzzyLaws ::
-     ( Epsilon (Element s)
-     , Signed (Element s)
+     ( Signed (Element s)
      , Ord (Element s)
      , Normed s (Element s)
      , Signed s
-     , Space s
      , Epsilon s
-     , Eq s
      )
   => Element s
   -> [Law s]
@@ -110,14 +104,11 @@
   ]
 
 multiplicativeSpaceFuzzyLaws ::
-     ( Epsilon (Element s)
-     , Signed (Element s)
+     ( Signed (Element s)
      , Ord (Element s)
      , Normed s (Element s)
      , Signed s
-     , Space s
      , Epsilon s
-     , Eq s
      , Multiplicative s
      )
   => Element s
@@ -135,14 +126,12 @@
   ]
 
 multiplicativeGroupSpaceFuzzyLaws ::
-     ( Epsilon (Element s)
-     , Signed (Element s)
+     ( Signed (Element s)
      , Ord (Element s)
      , Normed s (Element s)
      , Signed s
      , Space s
      , Epsilon s
-     , Eq s
      , MultiplicativeGroup s
      )
   => Element s
@@ -163,10 +152,8 @@
      , Ord a
      , Normed (r a) a
      , Signed (r a)
-     , Multiplicative (r a)
      , MultiplicativeGroup (r a)
      , Epsilon (r a)
-     , Eq (r a)
      )
   => a
   -> [Law (r a)]
@@ -224,7 +211,7 @@
      ( Ord a
      , Semiring a
      , Epsilon a
-     , Eq a)
+     )
   => [Law a]
 semiringFuzzyLaws = additiveLaws <> distributionFuzzyLaws
 
