diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,11 @@
+# 0.3
+
+Support for GHC 9.10.2.
+
+# 0.2
+
+Ported to use Digits library
+
+# 0.1
+
+Initial release
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2008, N-Sim Ltd.
+Copyright (c) 2008-2009, N-Sim Ltd., (c) 2025 Henry Bucklow
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
diff --git a/Setup.lhs b/Setup.lhs
deleted file mode 100644
--- a/Setup.lhs
+++ /dev/null
@@ -1,7 +0,0 @@
-#! /usr/bin/env runhaskell
-
-> import Distribution.Simple
-> import System.Cmd
-> tests _ _ _ _ = system "runhaskell src/Tests.hs" >> return ()
-> main = defaultMainWithHooks (simpleUserHooks {runTests = tests})
-
diff --git a/luhn.cabal b/luhn.cabal
--- a/luhn.cabal
+++ b/luhn.cabal
@@ -1,19 +1,33 @@
-Build-Type: Custom
-Name: luhn
-Category: Data
-Version: 0.2
-Cabal-Version: >= 1.2
-Synopsis: An implementation of Luhn's check digit algorithm.
-Description: An implementation of Luhn's check digit algorithm.
-License: BSD3
-License-File: LICENSE
-Copyright: (c) 2008-2009 N-Sim Ltd.
-Author: Henry Bucklow
-Maintainer: jhb@n-sim.com
-Tested-With: GHC==6.12
-Build-Depends: base >= 4 && < 5, QuickCheck, digits
-Exposed-Modules: Luhn
-Hs-Source-Dirs: src
-Extra-Source-Files: src/Tests.hs
-GHC-Options: -Wall
+cabal-version: 3.8
+name: luhn
+version: 0.3
+category: Data
+synopsis: An implementation of Luhn's check digit algorithm.
+description: An implementation of Luhn's check digit algorithm. This is a simple algorithm
+  used to validate a variety of identification numbers, such as credit card numbers.
+  See <http://en.wikipedia.org/wiki/Luhn_algorithm> for more details.
+license: BSD-3-Clause
+license-file: LICENSE
+copyright: (c) 2008-2009 N-Sim Ltd., 2025 Henry Bucklow
+author: Henry Bucklow
+maintainer: opensource@elsie.org.uk
+tested-with: GHC==9.12.2
+extra-doc-files: CHANGELOG.md
 
+source-repository head
+    type: git
+    location: https://github.com/sffubs/luhn.git
+
+library
+    build-depends: base >= 4 && < 5, digits < 1, QuickCheck < 3
+    exposed-modules: Luhn
+    hs-source-dirs: src
+    ghc-options: -Wall
+    default-language: Haskell2010
+
+test-suite luhn-tests
+    hs-source-dirs: test
+    main-is: Tests.hs
+    ghc-options: -Wall
+    build-depends: base >= 4 && < 5, luhn, QuickCheck
+    default-language: Haskell2010
diff --git a/src/Luhn.hs b/src/Luhn.hs
--- a/src/Luhn.hs
+++ b/src/Luhn.hs
@@ -21,7 +21,7 @@
 ) where
 
 import Data.Digits
-import Test.QuickCheck
+import Test.QuickCheck hiding (total)
 
 -- | Like Python's enumerate function - returns a tuple where the first
 --   element is the index from 0 of the second element in the input list.
diff --git a/src/Tests.hs b/src/Tests.hs
deleted file mode 100644
--- a/src/Tests.hs
+++ /dev/null
@@ -1,12 +0,0 @@
-module Main where
-
-import Luhn
-import Text.Printf
-import Test.QuickCheck
-
-tests = [
-    ("checkLuhn", quickCheck prop_checkLuhn),
-    ("checkSingleError", quickCheck prop_checkSingleError)]
-
-main = mapM_ (\(s,a) -> printf "%-25s: " s >> a) tests
-
diff --git a/test/Tests.hs b/test/Tests.hs
new file mode 100644
--- /dev/null
+++ b/test/Tests.hs
@@ -0,0 +1,14 @@
+module Main where
+
+import Luhn
+import Text.Printf
+import Test.QuickCheck
+
+tests :: [(String, IO ())]
+tests = [
+    ("checkLuhn", quickCheck prop_checkLuhn),
+    ("checkSingleError", quickCheck prop_checkSingleError)]
+
+main :: IO ()
+main = mapM_ (\(s,a) -> printf "%-25s: " s >> a) tests
+
