diff --git a/src/Data/AdditiveGroup.hs b/src/Data/AdditiveGroup.hs
--- a/src/Data/AdditiveGroup.hs
+++ b/src/Data/AdditiveGroup.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE TypeOperators, CPP #-}
 ----------------------------------------------------------------------
 -- |
 -- Module      :   Data.AdditiveGroup
@@ -55,12 +55,16 @@
 -- 
 -- instance AdditiveGroup n where {zeroV=0; (^+^) = (+); negateV = negate}
 
-instance AdditiveGroup Int     where {zeroV=0; (^+^) = (+); negateV = negate}
-instance AdditiveGroup Integer where {zeroV=0; (^+^) = (+); negateV = negate}
-instance AdditiveGroup Float   where {zeroV=0; (^+^) = (+); negateV = negate}
-instance AdditiveGroup Double  where {zeroV=0; (^+^) = (+); negateV = negate}
-instance Integral a => AdditiveGroup (Ratio a) where
-  {zeroV=0; (^+^) = (+); negateV = negate}
+#define ScalarTypeCon(con,t) \
+  instance con => AdditiveGroup (t) where {zeroV=0; (^+^) = (+); negateV = negate}
+
+#define ScalarType(t) ScalarTypeCon((),t)
+
+ScalarType(Int)
+ScalarType(Integer)
+ScalarType(Float)
+ScalarType(Double)
+ScalarTypeCon(Integral a,Ratio a)
 
 instance (RealFloat v, AdditiveGroup v) => AdditiveGroup (Complex v) where
   zeroV   = zeroV :+ zeroV
diff --git a/src/Data/VectorSpace.hs b/src/Data/VectorSpace.hs
--- a/src/Data/VectorSpace.hs
+++ b/src/Data/VectorSpace.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE MultiParamTypeClasses, TypeOperators
-           , TypeFamilies, UndecidableInstances
+           , TypeFamilies, UndecidableInstances, CPP
+           , FlexibleContexts
  #-}
 {-# OPTIONS_GHC -Wall #-}
 ----------------------------------------------------------------------
@@ -48,7 +49,7 @@
 infixr 7 <.>
 
 -- | Adds inner (dot) products.
-class VectorSpace v => InnerSpace v where
+class (VectorSpace v, AdditiveGroup (Scalar v)) => InnerSpace v where
   -- | Inner/dot product
   (<.>) :: v -> v -> Scalar v
 
@@ -87,15 +88,16 @@
 project :: (InnerSpace v, s ~ Scalar v, Fractional s) => v -> v -> v
 project u v = ((v <.> u) / magnitudeSq u) *^ u
 
-instance VectorSpace Double where
-  type Scalar Double = Double
-  (*^) = (*)
-instance InnerSpace  Double where (<.>) = (*)
+#define ScalarType(t) \
+  instance VectorSpace (t) where \
+    { type Scalar (t) = (t) \
+    ; (*^) = (*) } ; \
+  instance InnerSpace  (t) where (<.>) = (*)
 
-instance VectorSpace Float  where
-  type Scalar Float = Float
-  (*^)  = (*)
-instance InnerSpace  Float  where (<.>) = (*)
+ScalarType(Int)
+ScalarType(Integer)
+ScalarType(Double)
+ScalarType(Float)
 
 instance Integral a => VectorSpace (Ratio a) where
   type Scalar (Ratio a) = Ratio a
@@ -106,7 +108,7 @@
   type Scalar (Complex v) = Scalar v
   s*^(u :+ v) = s*^u :+ s*^v
 
-instance (RealFloat v, InnerSpace v, s ~ Scalar v, AdditiveGroup s)
+instance (RealFloat v, InnerSpace v)
      => InnerSpace (Complex v) where
   (u :+ v) <.> (u' :+ v') = (u <.> u') ^+^ (v <.> v')
 
@@ -126,8 +128,7 @@
   s *^ (u,v) = (s*^u,s*^v)
 
 instance ( InnerSpace u, s ~ Scalar u
-         , InnerSpace v, s ~ Scalar v
-         , AdditiveGroup (Scalar v) )
+         , InnerSpace v, s ~ Scalar v )
     => InnerSpace (u,v) where
   (u,v) <.> (u',v') = (u <.> u') ^+^ (v <.> v')
 
@@ -140,8 +141,7 @@
 
 instance ( InnerSpace u, s ~ Scalar u
          , InnerSpace v, s ~ Scalar v
-         , InnerSpace w, s ~ Scalar w
-         , AdditiveGroup s )
+         , InnerSpace w, s ~ Scalar w )
     => InnerSpace (u,v,w) where
   (u,v,w) <.> (u',v',w') = u<.>u' ^+^ v<.>v' ^+^ w<.>w'
 
@@ -156,8 +156,7 @@
 instance ( InnerSpace u, s ~ Scalar u
          , InnerSpace v, s ~ Scalar v
          , InnerSpace w, s ~ Scalar w
-         , InnerSpace x, s ~ Scalar x
-         , AdditiveGroup s )
+         , InnerSpace x, s ~ Scalar x )
     => InnerSpace (u,v,w,x) where
   (u,v,w,x) <.> (u',v',w',x') = u<.>u' ^+^ v<.>v' ^+^ w<.>w' ^+^ x<.>x'
 
@@ -195,7 +194,7 @@
 
 
 
-instance (InnerSpace a, AdditiveGroup (Scalar a)) => InnerSpace (Maybe a) where
+instance InnerSpace a => InnerSpace (Maybe a) where
   -- dotting with zero (vector) yields zero (scalar)
   Nothing <.> _     = zeroV
   _ <.> Nothing     = zeroV
diff --git a/vector-space.cabal b/vector-space.cabal
--- a/vector-space.cabal
+++ b/vector-space.cabal
@@ -1,5 +1,5 @@
 Name:                vector-space
-Version:             0.8.3
+Version:             0.8.4
 Cabal-Version:       >= 1.6
 Synopsis:            Vector & affine spaces, linear maps, and derivatives
 Category:            math
