diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,57 @@
-language: haskell
+# NB: don't set `language: haskell` here
+
+# See also https://github.com/hvr/multi-ghc-travis for more information
+env:
+ # we have to use CABALVER=1.16 for GHC<7.6 as well, as there's
+ # no package for earlier cabal versions in the PPA
+ - GHCVER=7.4.2 CABALVER=1.16
+ - GHCVER=7.6.3 CABALVER=1.16
+ - GHCVER=7.8.2 CABALVER=1.18
+ # NOTE: we can't use Cabal 1.20 yet due to
+ #  https://github.com/haskell/cabal/issues/1806
+ - GHCVER=head  CABALVER=1.20
+
+matrix:
+  allow_failures:
+   - env: GHCVER=head  CABALVER=1.20
+
+# Note: the distinction between `before_install` and `install` is not
+#       important.
+before_install:
+ - travis_retry sudo add-apt-repository -y ppa:hvr/ghc
+ - travis_retry sudo apt-get update
+ - travis_retry sudo apt-get install cabal-install-$CABALVER ghc-$GHCVER
+ - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH
+ - cabal --version
+
+install:
+ - travis_retry cabal update
+ - cabal install --only-dependencies
+
+# Here starts the actual work to be performed for the package under
+# test; any command which exits with a non-zero exit code causes the
+# build to fail.
+script:
+ # -v2 provides useful information for debugging
+ - cabal configure -v2
+
+ # this builds all libraries and executables
+ # (including tests/benchmarks)
+ - cabal build
+
+ # tests that a source-distribution can be generated
+ - cabal sdist
+
+ # check that the generated source-distribution can be built & installed
+ - export SRC_TGZ=$(cabal info . | awk '{print $2 ".tar.gz";exit}') ;
+   cd dist/;
+   if [ -f "$SRC_TGZ" ]; then
+      cabal install --force-reinstalls "$SRC_TGZ";
+   else
+      echo "expected '$SRC_TGZ' not found";
+      exit 1;
+   fi
+
 notifications:
   irc:
     channels:
diff --git a/eq.cabal b/eq.cabal
--- a/eq.cabal
+++ b/eq.cabal
@@ -1,6 +1,6 @@
 name:          eq
 category:      Type System
-version:       4.0.2
+version:       4.0.3
 license:       BSD3
 cabal-version: >= 1.6
 license-file:  LICENSE
diff --git a/src/Data/Eq/Type.hs b/src/Data/Eq/Type.hs
--- a/src/Data/Eq/Type.hs
+++ b/src/Data/Eq/Type.hs
@@ -46,7 +46,7 @@
 #endif
   ) where
 
-import Prelude ()
+import Prelude (flip)
 import Control.Category
 import Data.Semigroupoid
 import Data.Groupoid
@@ -82,32 +82,32 @@
 
 -- | Equality is transitive
 trans :: a := b -> b := c -> a := c
-trans = (>>>)
+trans = flip subst
 
 newtype Symm p a b = Symm { unsymm :: p b a }
 -- | Equality is symmetric
 symm :: (a := b) -> (b := a)
-symm a = unsymm (subst a (Symm id))
+symm a = unsymm (subst a (Symm refl))
 
 newtype Lift f a b = Lift { unlift :: f a := f b }
 -- | You can lift equality into any type constructor
 lift :: a := b -> f a := f b
-lift a = unlift (subst a (Lift id))
+lift a = unlift (subst a (Lift refl))
 
 newtype Lift2 f c a b = Lift2 { unlift2 :: f a c := f b c }
 -- | ... in any position
 lift2 :: a := b -> f a c := f b c
-lift2 a = unlift2 (subst a (Lift2 id))
+lift2 a = unlift2 (subst a (Lift2 refl))
 
 lift2' :: a := b -> c := d -> f a c := f b d
-lift2' ab cd = lift2 ab . lift cd
+lift2' ab cd = subst (lift2 ab) (lift cd)
 
 newtype Lift3 f c d a b = Lift3 { unlift3 :: f a c d := f b c d }
 lift3 :: a := b -> f a c d := f b c d
-lift3 a = unlift3 (subst a (Lift3 id))
+lift3 a = unlift3 (subst a (Lift3 refl))
 
 lift3' :: a := b -> c := d -> e := f -> g a c e := g b d f
-lift3' ab cd ef = lift3 ab . lift2 cd . lift ef
+lift3' ab cd ef = lift3 ab `subst` lift2 cd `subst` lift ef
 
 #ifdef LANGUAGE_TypeFamilies
 type family Inj f
@@ -115,19 +115,19 @@
 newtype Lower a b = Lower { unlower :: Inj a := Inj b }
 -- | Type constructors are injective, so you can lower equality through any type constructor
 lower :: f a := f b -> a := b
-lower eq = unlower (subst eq (Lower id :: Lower (f a) (f a)))
+lower eq = unlower (subst eq (Lower refl :: Lower (f a) (f a)))
 
 type family Inj2 f
 type instance Inj2 (f a b) = a
 newtype Lower2 a b = Lower2 { unlower2 :: Inj2 a := Inj2 b }
 -- | ... in any position
 lower2 :: f a c := f b c -> a := b
-lower2 eq = unlower2 (subst eq (Lower2 id :: Lower2 (f a c) (f a c)))
+lower2 eq = unlower2 (subst eq (Lower2 refl :: Lower2 (f a c) (f a c)))
 
 type family Inj3 f
 type instance Inj3 (f a b c) = a
 newtype Lower3 a b = Lower3 { unlower3 :: Inj3 a := Inj3 b }
 lower3 :: f a c d := f b c d -> a := b
-lower3 eq = unlower3 (subst eq (Lower3 id :: Lower3 (f a c d) (f a c d)))
+lower3 eq = unlower3 (subst eq (Lower3 refl :: Lower3 (f a c d) (f a c d)))
 
 #endif
