diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml
index 3bc6854be659d54460878c51c2bde9cf025e65c9..9ef7b4a0251ef9a342eb6232ebc29a7f1c82527e 100644
--- a/doc/src/sgml/datatype.sgml
+++ b/doc/src/sgml/datatype.sgml
@@ -4660,6 +4660,10 @@ SELECT * FROM pg_attribute
     <primary>internal</primary>
    </indexterm>
 
+   <indexterm zone="datatype-pseudo">
+    <primary>unknown</primary>
+   </indexterm>
+
    <indexterm zone="datatype-pseudo">
     <primary>opaque</primary>
    </indexterm>
@@ -4781,9 +4785,16 @@ SELECT * FROM pg_attribute
         <entry>Indicates that a function returns no value.</entry>
        </row>
 
+       <row>
+        <entry><type>unknown</></entry>
+        <entry>Identifies a not-yet-resolved type, e.g. of an undecorated
+         string literal.</entry>
+       </row>
+
        <row>
         <entry><type>opaque</></entry>
-        <entry>An obsolete type name that formerly served all the above purposes.</entry>
+        <entry>An obsolete type name that formerly served many of the above
+         purposes.</entry>
        </row>
       </tbody>
      </tgroup>
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index d7117cbc8f8d81cb52864cec0d145c007e35a78c..aebe898466a3834ab6c30d484097e73b2dcb13ac 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -2579,7 +2579,7 @@ WHERE c.altitude &gt; 500 AND c.tableoid = p.oid;
 
   <para>
    Another way to get the same effect is to use the <type>regclass</>
-   pseudo-type, which will print the table OID symbolically:
+   alias type, which will print the table OID symbolically:
 
 <programlisting>
 SELECT c.tableoid::regclass, c.name, c.altitude
diff --git a/doc/src/sgml/plhandler.sgml b/doc/src/sgml/plhandler.sgml
index 0fc5d7b411b6c7bb97cac6cc334c5c2e50dd9a30..57a2a05ed279b6ac11cca969fa5beb6c09ab732b 100644
--- a/doc/src/sgml/plhandler.sgml
+++ b/doc/src/sgml/plhandler.sgml
@@ -26,7 +26,7 @@
     language such as C, using the version-1 interface, and registered
     with <productname>PostgreSQL</productname> as taking no arguments
     and returning the type <type>language_handler</type>.  This
-    special pseudotype identifies the function as a call handler and
+    special pseudo-type identifies the function as a call handler and
     prevents it from being called directly in SQL commands.
     For more details on C language calling conventions and dynamic loading,
     see <xref linkend="xfunc-c">.
diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml
index 028ef10d91bd5b8274d2d610927f3835d94c45f5..9f054addeddc41fc2cebad1759f52f3ad8d4bfad 100644
--- a/doc/src/sgml/protocol.sgml
+++ b/doc/src/sgml/protocol.sgml
@@ -668,7 +668,7 @@
      number of parameter symbols (<literal>$</><replaceable>n</>)
      used in the query string.  Another special case is that a parameter's
      type can be specified as <type>void</> (that is, the OID of the
-     <type>void</> pseudotype).  This is meant to allow parameter symbols
+     <type>void</> pseudo-type).  This is meant to allow parameter symbols
      to be used for function parameters that are actually OUT parameters.
      Ordinarily there is no context in which a <type>void</> parameter
      could be used, but if such a parameter symbol appears in a function's
diff --git a/doc/src/sgml/queries.sgml b/doc/src/sgml/queries.sgml
index ef623d59bd110965e13c4c1f4aab2700963e56a9..30792f45f15a395408f2bd094e44e8db64e569d0 100644
--- a/doc/src/sgml/queries.sgml
+++ b/doc/src/sgml/queries.sgml
@@ -762,7 +762,7 @@ SELECT * FROM vw_getfoo;
      In some cases it is useful to define table functions that can
      return different column sets depending on how they are invoked.
      To support this, the table function can be declared as returning
-     the pseudotype <type>record</>.  When such a function is used in
+     the pseudo-type <type>record</>.  When such a function is used in
      a query, the expected row structure must be specified in the
      query itself, so that the system can know how to parse and plan
      the query.  This syntax looks like:
diff --git a/doc/src/sgml/ref/create_function.sgml b/doc/src/sgml/ref/create_function.sgml
index 8108a4309511b878b4de5c153fda903f1703443c..e7057789d32c76df76ea0c0f67d39370d32d430a 100644
--- a/doc/src/sgml/ref/create_function.sgml
+++ b/doc/src/sgml/ref/create_function.sgml
@@ -160,8 +160,8 @@ CREATE [ OR REPLACE ] FUNCTION
       </para>
       <para>
        Depending on the implementation language it might also be allowed
-       to specify <quote>pseudotypes</> such as <type>cstring</>.
-       Pseudotypes indicate that the actual argument type is either
+       to specify <quote>pseudo-types</> such as <type>cstring</>.
+       Pseudo-types indicate that the actual argument type is either
        incompletely specified, or outside the set of ordinary SQL data types.
       </para>
       <para>
@@ -199,7 +199,7 @@ CREATE [ OR REPLACE ] FUNCTION
        can be a base, composite, or domain type,
        or can reference the type of a table column.
        Depending on the implementation language it might also be allowed
-       to specify <quote>pseudotypes</> such as <type>cstring</>.
+       to specify <quote>pseudo-types</> such as <type>cstring</>.
        If the function is not supposed to return a value, specify
        <type>void</> as the return type.
       </para>
diff --git a/doc/src/sgml/ref/create_type.sgml b/doc/src/sgml/ref/create_type.sgml
index 5a09f1942a7064c89a767d771f27a8274cc9f6e8..7146c4a27b76c608f117dac4ed0e348cf99f17d3 100644
--- a/doc/src/sgml/ref/create_type.sgml
+++ b/doc/src/sgml/ref/create_type.sgml
@@ -824,7 +824,7 @@ CREATE TYPE <replaceable class="parameter">name</replaceable>
    In <productname>PostgreSQL</productname> versions before 7.3, it
    was customary to avoid creating a shell type at all, by replacing the
    functions' forward references to the type name with the placeholder
-   pseudotype <type>opaque</>.  The <type>cstring</> arguments and
+   pseudo-type <type>opaque</>.  The <type>cstring</> arguments and
    results also had to be declared as <type>opaque</> before 7.3.  To
    support loading of old dump files, <command>CREATE TYPE</> will
    accept I/O functions declared using <type>opaque</>, but it will issue
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index d7a3513d29590dec4df170c34584f79db98e246c..7ce911583256fbae730d293d5a1372e070231569 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -490,8 +490,7 @@ CheckAttributeType(const char *attname,
 	char		att_typtype = get_typtype(atttypid);
 	Oid			att_typelem;
 
-	if (atttypid == UNKNOWNOID ||
-		att_typtype == TYPTYPE_PSEUDO)
+	if (att_typtype == TYPTYPE_PSEUDO)
 	{
 		/*
 		 * Refuse any attempt to create a pseudo-type column, except for a
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
index 79a9f108a66cc83593ee41b9240f7c4a1bb90f07..417cfc36ec62a31936de3590b35d057ffbe6a8e5 100644
--- a/src/include/catalog/catversion.h
+++ b/src/include/catalog/catversion.h
@@ -53,6 +53,6 @@
  */
 
 /*							yyyymmddN */
-#define CATALOG_VERSION_NO	201701201
+#define CATALOG_VERSION_NO	201701251
 
 #endif
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index c2350f38677171686c4e2f96d519d7c3cd806a65..6e4c65e6ad3267a2257a91d9b956542b1ae8ff44 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -418,7 +418,7 @@ DESCR("relative, limited-range time interval (Unix delta time)");
 DATA(insert OID = 704 (  tinterval PGNSP PGUID 12 f b T f t \054 0	 0 1025 tintervalin tintervalout tintervalrecv tintervalsend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));
 DESCR("(abstime,abstime), time interval");
 #define TINTERVALOID	704
-DATA(insert OID = 705 (  unknown   PGNSP PGUID -2 f b X f t \054 0	 0 0 unknownin unknownout unknownrecv unknownsend - - - c p f 0 -1 0 0 _null_ _null_ _null_ ));
+DATA(insert OID = 705 (  unknown   PGNSP PGUID -2 f p X f t \054 0	 0 0 unknownin unknownout unknownrecv unknownsend - - - c p f 0 -1 0 0 _null_ _null_ _null_ ));
 DESCR("");
 #define UNKNOWNOID		705
 
diff --git a/src/test/regress/expected/type_sanity.out b/src/test/regress/expected/type_sanity.out
index e5adfba631d1804adf291e850da4699bb099bc34..312d290e73f08fe160577745a8a0b647b17c11b9 100644
--- a/src/test/regress/expected/type_sanity.out
+++ b/src/test/regress/expected/type_sanity.out
@@ -59,7 +59,7 @@ WHERE (p1.typtype = 'c' AND p1.typrelid = 0) OR
 -- Look for types that should have an array type according to their typtype,
 -- but don't.  We exclude composites here because we have not bothered to
 -- make array types corresponding to the system catalogs' rowtypes.
--- NOTE: as of 9.1, this check finds pg_node_tree, smgr, and unknown.
+-- NOTE: as of v10, this check finds pg_node_tree and smgr.
 SELECT p1.oid, p1.typname
 FROM pg_type as p1
 WHERE p1.typtype not in ('c','d','p') AND p1.typname NOT LIKE E'\\_%'
@@ -71,8 +71,7 @@ WHERE p1.typtype not in ('c','d','p') AND p1.typname NOT LIKE E'\\_%'
 -----+--------------
  194 | pg_node_tree
  210 | smgr
- 705 | unknown
-(3 rows)
+(2 rows)
 
 -- Make sure typarray points to a varlena array type of our own base
 SELECT p1.oid, p1.typname as basetype, p2.typname as arraytype,
diff --git a/src/test/regress/sql/type_sanity.sql b/src/test/regress/sql/type_sanity.sql
index f7c5c9d5d43fb99c30c51dbb688016b48788e9dd..0282f84d2e5567a48b0008367b8624f28852fb88 100644
--- a/src/test/regress/sql/type_sanity.sql
+++ b/src/test/regress/sql/type_sanity.sql
@@ -53,7 +53,7 @@ WHERE (p1.typtype = 'c' AND p1.typrelid = 0) OR
 -- Look for types that should have an array type according to their typtype,
 -- but don't.  We exclude composites here because we have not bothered to
 -- make array types corresponding to the system catalogs' rowtypes.
--- NOTE: as of 9.1, this check finds pg_node_tree, smgr, and unknown.
+-- NOTE: as of v10, this check finds pg_node_tree and smgr.
 
 SELECT p1.oid, p1.typname
 FROM pg_type as p1