diff --git a/CHANGES.txt b/CHANGES.txt
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -50,3 +50,10 @@
 -------------
 Require QuickCheck >= 2.4. This changes the API for the Arbitrary and CoArbitrary
 instances, so it gets a version number bump.
+
+Version 0.4.0
+-------------
+
+Added Semigroup instance.
+Enabled "cabal test".
+Master repository now on GitHub.
diff --git a/Data/Ranged/RangedSet.hs b/Data/Ranged/RangedSet.hs
--- a/Data/Ranged/RangedSet.hs
+++ b/Data/Ranged/RangedSet.hs
@@ -58,7 +58,6 @@
 
 import Data.Ranged.Boundaries
 import Data.Ranged.Ranges
-import Data.Monoid
 
 import Data.List
 import Test.QuickCheck
@@ -72,8 +71,10 @@
 newtype DiscreteOrdered v => RSet v = RSet {rSetRanges :: [Range v]}
    deriving (Eq, Show)
 
+instance DiscreteOrdered a => Semigroup (RSet a) where
+   (<>) = rSetUnion
+
 instance DiscreteOrdered a => Monoid (RSet a) where
-    mappend = rSetUnion
     mempty = rSetEmpty
 
 -- | Determine if the ranges in the list are both in order and non-overlapping.
diff --git a/INSTALL.txt b/INSTALL.txt
deleted file mode 100644
--- a/INSTALL.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-As user, from within the project directory:
-
-   runghc Setup.hs configure
-   runghc Setup.hs build
-
-As root or administrator:
-
-   runghc Setup.hs install
-   
-If you have Haddock then generate the documentation with:
-
-   runghc Setup.hs haddock
-   
-If you use Hugs then type "runhugs" instead of "runghc".
diff --git a/Ranged-sets.cabal b/Ranged-sets.cabal
--- a/Ranged-sets.cabal
+++ b/Ranged-sets.cabal
@@ -1,14 +1,13 @@
 name: Ranged-sets
-version: 0.3.0
-cabal-version: -any
+version: 0.4.0
+cabal-version: 1.24
 build-type: Simple
 license: BSD3
 license-file: LICENSE.txt
-copyright: Paul Johnson, 2005, 2006, 2007, 2008
+copyright: Paul Johnson, 2005, 2006, 2007, 2008, 2019
 maintainer: paul@cogito.org.uk
-build-depends: HUnit -any, QuickCheck >=2, base >=4 && <5
 stability: beta
-homepage: http://code.haskell.org/ranged-sets
+homepage: https://github.com/PaulJohnson/Ranged-sets
 package-url:
 bug-reports:
 synopsis: Ranged sets for Haskell
@@ -21,34 +20,26 @@
              >    ("F" <= s < "G")
 category: Data
 author: Paul Johnson
-tested-with:
-data-files:
-data-dir: ""
-extra-source-files: CHANGES.txt INSTALL.txt README.txt TODO.txt
-                    tests/Main.hs tests/Makefile
-extra-tmp-files:
-exposed-modules: Data.Ranged Data.Ranged.Ranges
+extra-source-files: CHANGES.txt README.txt
+
+library
+    build-depends: HUnit -any, QuickCheck >=2, base >=4 && <5
+    exposed-modules: Data.Ranged Data.Ranged.Ranges
                  Data.Ranged.RangedSet Data.Ranged.Boundaries
-exposed: True
-buildable: True
-build-tools:
-cpp-options:
-cc-options:
-ld-options:
-pkgconfig-depends:
-frameworks:
-c-sources:
-extensions:
-extra-libraries:
-extra-lib-dirs:
-includes:
-install-includes:
-include-dirs:
-hs-source-dirs: .
-other-modules:
-ghc-prof-options:
-ghc-shared-options:
-ghc-options: -Wall
-hugs-options:
-nhc98-options:
-jhc-options:
+    exposed: True
+    buildable: True
+    default-language: Haskell2010
+
+
+Test-suite properties
+    type: exitcode-stdio-1.0
+    default-language: Haskell2010
+    main-is: Main.hs
+    hs-source-dirs: tests .
+    other-modules: Data.Ranged Data.Ranged.Ranges
+                 Data.Ranged.RangedSet Data.Ranged.Boundaries
+    build-depends:
+        base >= 4 && < 5,
+        HUnit,
+        QuickCheck
+    
diff --git a/TODO.txt b/TODO.txt
deleted file mode 100644
--- a/TODO.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Things to do:
-  
-* Test with yhc.
-
-* Define ranges of times and dates.  The set of all Mondays, for instance,
-  or the set of all second weeks in the month.  Any such functions would
-  have to take a start date because the only alternative is to start
-  with the epoch, and that would not be efficient.  The existing date-time
-  functions look a bit clunky for this job, but the proposals of
-  Ashley Yakeley at http://semantic.org/TimeLib/ look more suitable.
-
-
-  
diff --git a/tests/Main.hs b/tests/Main.hs
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -fglasgow-exts #-}
+{-# LANGUAGE ScopedTypeVariables #-}
 
 module Main where
 
@@ -8,7 +8,7 @@
 
 
 conf :: Args
-conf = stdArgs { maxSuccess = 1000, maxDiscard = 10000 }
+conf = stdArgs { maxSuccess = 1000, maxDiscardRatio = 100 }
 
 check :: (Test.QuickCheck.Testable prop) => prop -> IO ()
 check = quickCheckWith conf
diff --git a/tests/Makefile b/tests/Makefile
deleted file mode 100644
--- a/tests/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-# Tests for Ranged Sets.
-
-all:
-	ghc --make -fhpc -i.. -odir . -hidir . -Wall Main.hs -o test-rset
-	rm -f test-rset.tix
-	./test-rset
-	hpc markup --destdir=Report test-rset
-	hpc report test-rset
-
-clean:
-	rm -fR Data
-	rm -f test-rset.tix
-	rm -f test-rset
-	rm -f *.o *.hi
-	rm -fR Report
-
