diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -63,7 +63,7 @@
 	$(RM) html
 
 
-VERSION = 0.6.0
+VERSION = 0.6.1
 DISTDIR = alms-$(VERSION)
 TARBALL = $(DISTDIR).tar.gz
 
diff --git a/README b/README
--- a/README
+++ b/README
@@ -14,8 +14,8 @@
 
 GETTING STARTED
 
-  Alms requires GHC to build.  It is known to work with GHC 6.12.1 and
-  6.10.4, and likely no longer works with GHC 6.8.
+  Alms requires GHC to build.  It is known to work with GHC 7.0.2, and
+  and likely no longer works with GHC 6.
 
   Provided that a recent ghc is in your path, to build on UNIX it ought
   to be be sufficient to type:
@@ -89,7 +89,7 @@
 
   You can load libraries from the command line like this:
 
-    % ./alms -l libsocketcap
+    % ./alms -lsocketcap
 
   Or from within the REPL like this:
 
@@ -99,11 +99,9 @@
   REPL about identifiers:
 
     #- #i list Exn *
-    type +`a list : a = Cons of `a * `a list | Nil
-        -- built-in
-    module Exn
-        -- defined at "lib/libbasis.alms" (line 2, col. 3 to line 23, col. 3)
-    type +`a * +`b : a \/ b   -- built-in
+    type +`a list : `a = (::) of `a * `a list | ([])   -- built-in
+    module Exn    -- defined at lib/libbasis.alms:198:1-32
+    type +`a * +`b : `a \/ `b   -- built-in
     val ( * ) : int -> int -> int   -- built-in
 
 
@@ -117,10 +115,10 @@
   \forall \exists \lambda         all ex fun   (binders)
   \alpha                          'a           (unlimited type variable)
   \hat\alpha                      `a           (affine type variable)
-  \to^A                           -o           (affine arrow)
-  \to^{\hat\alpha}                -[a]>        (arrow with qualifier)
-  \sqcup \sqcap                   \/ /\        (qualifier join and meet)
-  \pm \baro + -                   = * + -      (variances)
+  \to^A                           -A>          (affine arrow)
+  \to^{\hat\alpha}                -a>          (arrow with qualifier)
+  \sqcup                          \/           (qualifier join)
+  \pm \baro + -                   = 0 + -      (variances)
 
 
 EDITLINE TROUBLE
@@ -133,9 +131,17 @@
 
        % make clean; make FLAGS=-editline
 
+     or
+
+       % cabal install --flags="-editline" alms
+
    - Use readline instead:
 
        % make clean; make FLAGS=readline
+
+     or
+
+       % cabal install --flags="readline" alms
 
    - Try to install editline or readline . . .
 
diff --git a/TODO b/TODO
--- a/TODO
+++ b/TODO
@@ -1,4 +1,1 @@
  - some termination checking for type operators
- - remove direct dependency of Parser on Sigma (! patterns)
- - row types for protocols
- - type inference
diff --git a/alms.cabal b/alms.cabal
--- a/alms.cabal
+++ b/alms.cabal
@@ -1,5 +1,5 @@
 Name:           alms
-Version:        0.6.0
+Version:        0.6.1
 Copyright:      2011, Jesse A. Tov
 Cabal-Version:  >= 1.8
 License:        BSD3
diff --git a/ghc6-quasis.sh b/ghc6-quasis.sh
new file mode 100644
--- /dev/null
+++ b/ghc6-quasis.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+# Dirty hack to turn GHC 7 quasiquote syntax (e.g. "[ex|") into
+# GHC 6 ("[$ex|").  This relies on the fact that all my quasiquoters
+# have alphanumeric names of at least two characters (which
+# distinguishes them from built-in TH quasiquotes such as "[d|").
+
+exec sed 's/\[\([a-z][a-zA-Z0-9][a-zA-Z0-9]*\)|/[$\1|/g' "$2" > "$3"
diff --git a/src/AST/Ident.hs b/src/AST/Ident.hs
--- a/src/AST/Ident.hs
+++ b/src/AST/Ident.hs
@@ -360,8 +360,8 @@
   showsPrec p (LidAnti a) = showsPrec p a
 
 instance Show (Uid i) where
-  showsPrec _ (Uid _ s@('?':_)) = showString s
-  showsPrec _ (Uid _ s)         = showsIdent s
+  showsPrec _ (Uid _ s@(':':_)) = showChar '(' . showString s . showChar ')'
+  showsPrec _ (Uid _ s)         = showString s
   showsPrec p (UidAnti a)       = showsPrec p a
 
 -- | Show an identifier with parens if necessary
diff --git a/src/Data/Empty.hs b/src/Data/Empty.hs
--- a/src/Data/Empty.hs
+++ b/src/Data/Empty.hs
@@ -3,17 +3,21 @@
   Empty, elimEmpty, elimEmptyF,
 ) where
 
-import Data.Generics (Typeable, Data)
+import Data.Generics (Typeable, Data(..), mkDataType)
 import Unsafe.Coerce (unsafeCoerce)
 
 -- | An uninhabited type
 data Empty deriving Typeable
 
-deriving instance Data Empty
+instance Data Empty where
+  gfoldl _ _    = elimEmpty
+  gunfold _ _ _ = error "Empty.gunfold"
+  toConstr      = elimEmpty
+  dataTypeOf _  = mkDataType "Data.Empty" []
 
 -- | Elimination for 'Empty'
 elimEmpty  ∷ Empty → a
-elimEmpty  = const undefined
+elimEmpty  = const (error "elimEmpty")
 
 -- | Elimination for 'Empty' under any functor, implemented as a no-op.
 elimEmptyF ∷ Functor f ⇒ f Empty → f a
diff --git a/src/Makefile b/src/Makefile
--- a/src/Makefile
+++ b/src/Makefile
@@ -21,17 +21,21 @@
 HSBOOT_SRC  = AST/*.hs-boot Statics/*.hs-boot
 
 HCOPTS  = -W -Wall -O0 $(EDITING) $(PARSEC) $(HIOPTS)
-HIOPTS  = $(NOWARN) $(IMPARR) $(UNICODE) $(LANGUAGE)
+HIOPTS  = $(NOWARN) $(UNICODE) $(LANGUAGE)
 EDITING = -DUSE_READLINE=System.Console.Editline.Readline
 PARSEC  = -DPARSEC_VERSION=3
-# IMPARR  = -DANNOTATION_PRINTING_RULE=Rule0
 NOWARN  = -fno-warn-unused-do-bind -fno-warn-orphans
 UNICODE = -DUNICODE
 LANGUAGE= `sed 's/^/-X/' extensions.txt`
 
+PROFILING = -prof -auto-all -osuf p_o -rtsopts
+
 $(EXE) $(EXE)-%: $(SRC)
 	$(GHC) -o $@ --make Main.hs $(HCOPTS)
 
+$(EXE)_p: $(EXE)
+	$(GHC) -o $@ --make Main.hs $(HCOPTS) $(PROFILING)
+
 %.hi: $(HS_SRC) $(HSBOOT_SRC)
 	$(GHC) --make `echo "$*" | sed 's@\.@/@g'`.hs $(HCOPTS)
 
@@ -39,8 +43,8 @@
 	$(GHCI) \*`echo "$*" | sed 's@\.@/@g'` $(HIOPTS)
 
 $(EXE)-%:     GHC     = ghc-$*
-$(EXE)-6.8.%: EDITING = -DUSE_READLINE=System.Console.Readline
 $(EXE)-6.%:   PARSEC  = -DPARSEC_VERSION=2
+$(EXE)-6.%:   HCOPTS += -F -pgmF ../ghc6-quasis.sh
 
 not-compiled:
 	@find . -name \*.hs | sed 's@^\./@@' | while read hs; do \
@@ -51,6 +55,7 @@
 clean:
 	$(RM) $(HS_SRC:.hs=.hi) $(HS_SRC:.hs=.o)
 	$(RM) $(HSBOOT_SRC:.hs-boot=.hi-boot) $(HSBOOT_SRC:.hs-boot=.o-boot)
+	$(RM) $(HS_SRC:.hs=.p_o) $(HSBOOT_SRC:.hs-boot=.p_o-boot) *.prof
 	$(RM) $(EXE) $(EXE)-6.*
 
 wc.%:
diff --git a/src/Statics/Rename.hs b/src/Statics/Rename.hs
--- a/src/Statics/Rename.hs
+++ b/src/Statics/Rename.hs
@@ -603,10 +603,10 @@
           Nothing -> return ()
           Just (u, _) ->
             repeated "Data constructor" u "type declaration" []
-        cons' <- forM cons $ \(u, mt) -> withLocation mt $ do
+        cons' <- forM cons $ \(u, mt) -> do
           -- XXX Why trivial?
           let u' = renTrivial u
-          tell [MdDatacon (getLoc mt) u u']
+          tell [MdDatacon (getLoc note) u u']
           mt'   <- traverse renameType mt
           return (u', mt')
         return (tdDat l' tvs' cons')
diff --git a/src/Util/UndoIO.hs b/src/Util/UndoIO.hs
--- a/src/Util/UndoIO.hs
+++ b/src/Util/UndoIO.hs
@@ -22,11 +22,13 @@
   = UndoIO {
       unUndoIO ∷ IORef [IO ()] → IO a
     }
-  deriving Functor
 
 instance Applicative UndoIO where
   pure    = return
   (<*>)   = ap
+
+instance Functor UndoIO where
+  fmap    = liftM
 
 instance Monad UndoIO where
   return  = UndoIO . const . return
