diff --git a/extra/singleton/authors.txt b/extra/classes/singleton/authors.txt
similarity index 100%
rename from extra/singleton/authors.txt
rename to extra/classes/singleton/authors.txt
diff --git a/extra/singleton/singleton-docs.factor b/extra/classes/singleton/singleton-docs.factor
similarity index 64%
rename from extra/singleton/singleton-docs.factor
rename to extra/classes/singleton/singleton-docs.factor
index 92ddcc494a..95b5b6af18 100644
--- a/extra/singleton/singleton-docs.factor
+++ b/extra/classes/singleton/singleton-docs.factor
@@ -1,5 +1,5 @@
 USING: help.markup help.syntax kernel words ;
-IN: singleton
+IN: classes.singleton
 
 HELP: SINGLETON:
 { $syntax "SINGLETON: class"
@@ -12,15 +12,3 @@ HELP: SINGLETON:
 } { $see-also
     POSTPONE: PREDICATE:
 } ;
-
-HELP: SINGLETONS:
-{ $syntax "SINGLETONS: classes... ;"
-} { $values
-    { "classes" "new singletons to define" }
-} { $description
-    "Defines a new singleton for each class in the list."
-} { $examples
-    { $example "USE: singleton" "SINGLETONS: foo bar baz ;" "" }
-} { $see-also
-    POSTPONE: SINGLETON:
-} ;
diff --git a/extra/classes/singleton/singleton-tests.factor b/extra/classes/singleton/singleton-tests.factor
new file mode 100644
index 0000000000..453a2a0ea5
--- /dev/null
+++ b/extra/classes/singleton/singleton-tests.factor
@@ -0,0 +1,12 @@
+USING: kernel singleton tools.test prettyprint io.streams.string ;
+IN: classes.singleton.tests
+
+[ ] [ SINGLETON: bzzt ] unit-test
+[ t ] [ bzzt bzzt? ] unit-test
+[ t ] [ bzzt bzzt eq? ] unit-test
+GENERIC: zammo ( obj -- )
+[ ] [ M: bzzt zammo drop "yes!" ; ] unit-test
+[ "yes!" ] [ bzzt zammo ] unit-test
+[ ] [ SINGLETON: omg ] unit-test
+[ t ] [ omg singleton? ] unit-test
+[ "USING: singleton ;\nIN: classes.singleton.tests\nSINGLETON: omg\n" ] [ [ omg see ] with-string-writer ] unit-test
diff --git a/extra/classes/singleton/singleton.factor b/extra/classes/singleton/singleton.factor
new file mode 100755
index 0000000000..61a519679c
--- /dev/null
+++ b/extra/classes/singleton/singleton.factor
@@ -0,0 +1,22 @@
+! Copyright (C) 2008 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: classes.predicate kernel namespaces parser quotations
+sequences words prettyprint prettyprint.backend prettyprint.sections
+compiler.units classes ;
+IN: classes.singleton
+
+PREDICATE: singleton < predicate-class
+    [ "predicate-definition" word-prop ]
+    [ [ eq? ] curry ] bi sequence= ;
+
+: define-singleton ( token -- )
+    create-class-in
+    dup save-location
+    \ singleton
+    over [ eq? ] curry define-predicate-class ;
+
+: SINGLETON:
+    scan define-singleton ; parsing
+
+M: singleton see-class* ( class -- )
+    <colon \ SINGLETON: pprint-word pprint-word ;
diff --git a/extra/db/types/types.factor b/extra/db/types/types.factor
index 9babfbcdb0..98bc451a6f 100755
--- a/extra/db/types/types.factor
+++ b/extra/db/types/types.factor
@@ -4,7 +4,7 @@ USING: arrays assocs db kernel math math.parser
 sequences continuations sequences.deep sequences.lib
 words namespaces tools.walker slots slots.private classes
 mirrors classes.tuple combinators calendar.format symbols
-singleton ;
+classes.singleton ;
 IN: db.types
 
 HOOK: modifier-table db ( -- hash )
diff --git a/extra/http/server/auth/providers/db/db.factor b/extra/http/server/auth/providers/db/db.factor
index 1e84e544b8..deab40e8d4 100755
--- a/extra/http/server/auth/providers/db/db.factor
+++ b/extra/http/server/auth/providers/db/db.factor
@@ -1,42 +1,42 @@
-! Copyright (C) 2008 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: db db.tuples db.types accessors
-http.server.auth.providers kernel continuations
-singleton ;
-IN: http.server.auth.providers.db
-
-user "USERS"
-{
-    { "username" "USERNAME" { VARCHAR 256 } +assigned-id+ }
-    { "realname" "REALNAME" { VARCHAR 256 } }
-    { "password" "PASSWORD" { VARCHAR 256 } +not-null+ }
-    { "email" "EMAIL" { VARCHAR 256 } }
-    { "ticket" "TICKET" { VARCHAR 256 } }
-    { "profile" "PROFILE" FACTOR-BLOB }
-} define-persistent
-
-: init-users-table user ensure-table ;
-
-SINGLETON: users-in-db
-
-: find-user ( username -- user )
-    <user>
-        swap >>username
-    select-tuple ;
-
-M: users-in-db get-user
-    drop
-    find-user ;
-
-M: users-in-db new-user
-    drop
-    [
-        dup username>> find-user [
-            drop f
-        ] [
-            dup insert-tuple
-        ] if
-    ] with-transaction ;
-
-M: users-in-db update-user
-    drop update-tuple ;
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: db db.tuples db.types accessors
+http.server.auth.providers kernel continuations
+classes.singleton ;
+IN: http.server.auth.providers.db
+
+user "USERS"
+{
+    { "username" "USERNAME" { VARCHAR 256 } +assigned-id+ }
+    { "realname" "REALNAME" { VARCHAR 256 } }
+    { "password" "PASSWORD" { VARCHAR 256 } +not-null+ }
+    { "email" "EMAIL" { VARCHAR 256 } }
+    { "ticket" "TICKET" { VARCHAR 256 } }
+    { "profile" "PROFILE" FACTOR-BLOB }
+} define-persistent
+
+: init-users-table user ensure-table ;
+
+SINGLETON: users-in-db
+
+: find-user ( username -- user )
+    <user>
+        swap >>username
+    select-tuple ;
+
+M: users-in-db get-user
+    drop
+    find-user ;
+
+M: users-in-db new-user
+    drop
+    [
+        dup username>> find-user [
+            drop f
+        ] [
+            dup insert-tuple
+        ] if
+    ] with-transaction ;
+
+M: users-in-db update-user
+    drop update-tuple ;
diff --git a/extra/http/server/sessions/storage/db/db.factor b/extra/http/server/sessions/storage/db/db.factor
index 471b7fa6df..e573b22ba1 100755
--- a/extra/http/server/sessions/storage/db/db.factor
+++ b/extra/http/server/sessions/storage/db/db.factor
@@ -1,46 +1,46 @@
-! Copyright (C) 2008 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: assocs accessors http.server.sessions.storage
-alarms kernel http.server db.tuples db.types singleton
-math.parser ;
-IN: http.server.sessions.storage.db
-
-SINGLETON: sessions-in-db
-
-TUPLE: session id namespace ;
-
-session "SESSIONS"
-{
-    { "id" "ID" INTEGER +native-id+ }
-    { "namespace" "NAMESPACE" FACTOR-BLOB }
-} define-persistent
-
-: init-sessions-table session ensure-table ;
-
-: <session> ( id -- session )
-    session construct-empty
-        swap dup [ string>number ] when >>id ;
-
-M: sessions-in-db get-session ( id storage -- namespace/f )
-    drop
-    dup [
-        <session>
-        select-tuple dup [ namespace>> ] when
-    ] when ;
-
-M: sessions-in-db update-session ( namespace id storage -- )
-    drop
-    <session>
-        swap >>namespace
-    update-tuple ;
-
-M: sessions-in-db delete-session ( id storage -- )
-    drop
-    <session>
-    delete-tuple ;
-
-M: sessions-in-db new-session ( namespace storage -- id )
-    drop
-    f <session>
-        swap >>namespace
-    [ insert-tuple ] [ id>> number>string ] bi ;
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: assocs accessors http.server.sessions.storage
+alarms kernel http.server db.tuples db.types math.parser
+classes.singleton ;
+IN: http.server.sessions.storage.db
+
+SINGLETON: sessions-in-db
+
+TUPLE: session id namespace ;
+
+session "SESSIONS"
+{
+    { "id" "ID" INTEGER +native-id+ }
+    { "namespace" "NAMESPACE" FACTOR-BLOB }
+} define-persistent
+
+: init-sessions-table session ensure-table ;
+
+: <session> ( id -- session )
+    session construct-empty
+        swap dup [ string>number ] when >>id ;
+
+M: sessions-in-db get-session ( id storage -- namespace/f )
+    drop
+    dup [
+        <session>
+        select-tuple dup [ namespace>> ] when
+    ] when ;
+
+M: sessions-in-db update-session ( namespace id storage -- )
+    drop
+    <session>
+        swap >>namespace
+    update-tuple ;
+
+M: sessions-in-db delete-session ( id storage -- )
+    drop
+    <session>
+    delete-tuple ;
+
+M: sessions-in-db new-session ( namespace storage -- id )
+    drop
+    f <session>
+        swap >>namespace
+    [ insert-tuple ] [ id>> number>string ] bi ;
diff --git a/extra/math/polynomials/polynomials.factor b/extra/math/polynomials/polynomials.factor
index d6ac71e629..0b0d3520ef 100644
--- a/extra/math/polynomials/polynomials.factor
+++ b/extra/math/polynomials/polynomials.factor
@@ -22,7 +22,7 @@ PRIVATE>
 : p= ( p p -- ? ) pextend = ;
 
 : ptrim ( p -- p )
-    dup singleton? [ [ zero? ] right-trim ] unless ;
+    dup length 1 = [ [ zero? ] right-trim ] unless ;
 
 : 2ptrim ( p p -- p p ) [ ptrim ] bi@ ;
 : p+ ( p p -- p ) pextend v+ ;
diff --git a/extra/math/text/english/english.factor b/extra/math/text/english/english.factor
index b77ac725ab..cba8c28310 100755
--- a/extra/math/text/english/english.factor
+++ b/extra/math/text/english/english.factor
@@ -79,7 +79,7 @@ SYMBOL: and-needed?
     ] if ;
 
 : recombine ( seq -- str )
-    dup singleton? [
+    dup length 1 = [
         first 3digits>text
     ] [
         dup set-conjunction "" swap
diff --git a/extra/random/unix/unix.factor b/extra/random/unix/unix.factor
index f3f55007f0..3be2697bdf 100644
--- a/extra/random/unix/unix.factor
+++ b/extra/random/unix/unix.factor
@@ -1,5 +1,5 @@
 USING: alien.c-types io io.files io.nonblocking kernel
-namespaces random io.encodings.binary singleton init
+namespaces random io.encodings.binary init
 accessors system ;
 IN: random.unix
 
diff --git a/extra/sequences/lib/lib-tests.factor b/extra/sequences/lib/lib-tests.factor
index 6e6a924382..99565e966c 100755
--- a/extra/sequences/lib/lib-tests.factor
+++ b/extra/sequences/lib/lib-tests.factor
@@ -46,9 +46,6 @@ IN: sequences.lib.tests
 [ { 1 -1 5 2 4 } [ < ] monotonic-split [ >array ] map ] unit-test
 [ { { 1 1 1 1 } { 2 2 } { 3 } { 4 } { 5 } { 6 6 6 } } ]
 [ { 1 1 1 1 2 2 3 4 5 6 6 6 } [ = ] monotonic-split [ >array ] map ] unit-test
-[ f ] [ { } singleton? ] unit-test
-[ t ] [ { "asdf" } singleton? ] unit-test
-[ f ] [ { "asdf" "bsdf" } singleton? ] unit-test
 
 [ 2 ] [ V{ 10 20 30 } [ delete-random drop ] keep length ] unit-test
 [ V{ } [ delete-random drop ] keep length ] must-fail
diff --git a/extra/sequences/lib/lib.factor b/extra/sequences/lib/lib.factor
index d246b16b8d..945ba1a3b7 100755
--- a/extra/sequences/lib/lib.factor
+++ b/extra/sequences/lib/lib.factor
@@ -98,9 +98,6 @@ MACRO: firstn ( n -- )
         v, [ pick ,, call [ v, ] unless ] curry 2each ,v
     ] { } make ;
 
-: singleton? ( seq -- ? )
-    length 1 = ;
-
 : delete-random ( seq -- value )
     [ length random ] keep [ nth ] 2keep delete-nth ;
 
diff --git a/extra/singleton/singleton-tests.factor b/extra/singleton/singleton-tests.factor
deleted file mode 100644
index 1698181ed3..0000000000
--- a/extra/singleton/singleton-tests.factor
+++ /dev/null
@@ -1,9 +0,0 @@
-USING: kernel singleton tools.test ;
-IN: singleton.tests
-
-[ ] [ SINGLETON: bzzt ] unit-test
-[ t ] [ bzzt bzzt? ] unit-test
-[ t ] [ bzzt bzzt eq? ] unit-test
-GENERIC: zammo ( obj -- )
-[ ] [ M: bzzt zammo drop "yes!" ; ] unit-test
-[ "yes!" ] [ bzzt zammo ] unit-test
diff --git a/extra/singleton/singleton.factor b/extra/singleton/singleton.factor
deleted file mode 100755
index 9ec9f2f4a3..0000000000
--- a/extra/singleton/singleton.factor
+++ /dev/null
@@ -1,16 +0,0 @@
-! Copyright (C) 2008 Doug Coleman.
-! See http://factorcode.org/license.txt for BSD license.
-USING: classes.predicate kernel namespaces parser quotations
-sequences words ;
-IN: singleton
-
-: define-singleton ( token -- )
-    create-class-in
-    \ word
-    over [ eq? ] curry define-predicate-class ;
-
-: SINGLETON:
-    scan define-singleton ; parsing
-
-: SINGLETONS:
-    ";" parse-tokens [ define-singleton ] each ; parsing
diff --git a/extra/ldap/authors.txt b/unmaintained/ldap/authors.txt
similarity index 100%
rename from extra/ldap/authors.txt
rename to unmaintained/ldap/authors.txt
diff --git a/extra/ldap/conf/addentry.ldif b/unmaintained/ldap/conf/addentry.ldif
similarity index 100%
rename from extra/ldap/conf/addentry.ldif
rename to unmaintained/ldap/conf/addentry.ldif
diff --git a/extra/ldap/conf/createdit.ldif b/unmaintained/ldap/conf/createdit.ldif
similarity index 100%
rename from extra/ldap/conf/createdit.ldif
rename to unmaintained/ldap/conf/createdit.ldif
diff --git a/extra/ldap/conf/slapd.conf b/unmaintained/ldap/conf/slapd.conf
similarity index 100%
rename from extra/ldap/conf/slapd.conf
rename to unmaintained/ldap/conf/slapd.conf
diff --git a/extra/ldap/ldap-tests.factor b/unmaintained/ldap/ldap-tests.factor
similarity index 100%
rename from extra/ldap/ldap-tests.factor
rename to unmaintained/ldap/ldap-tests.factor
diff --git a/extra/ldap/ldap.factor b/unmaintained/ldap/ldap.factor
similarity index 100%
rename from extra/ldap/ldap.factor
rename to unmaintained/ldap/ldap.factor
diff --git a/extra/ldap/libldap/authors.txt b/unmaintained/ldap/libldap/authors.txt
similarity index 100%
rename from extra/ldap/libldap/authors.txt
rename to unmaintained/ldap/libldap/authors.txt
diff --git a/extra/ldap/libldap/libldap.factor b/unmaintained/ldap/libldap/libldap.factor
similarity index 100%
rename from extra/ldap/libldap/libldap.factor
rename to unmaintained/ldap/libldap/libldap.factor
diff --git a/extra/ldap/libldap/tags.txt b/unmaintained/ldap/libldap/tags.txt
similarity index 100%
rename from extra/ldap/libldap/tags.txt
rename to unmaintained/ldap/libldap/tags.txt
diff --git a/extra/ldap/summary.txt b/unmaintained/ldap/summary.txt
similarity index 100%
rename from extra/ldap/summary.txt
rename to unmaintained/ldap/summary.txt
diff --git a/extra/ldap/tags.txt b/unmaintained/ldap/tags.txt
similarity index 100%
rename from extra/ldap/tags.txt
rename to unmaintained/ldap/tags.txt