First improvement wrt #2632: change to give more meaningful fail message.
diff --git a/src/main/java/com/fasterxml/jackson/databind/type/TypeFactory.java b/src/main/java/com/fasterxml/jackson/databind/type/TypeFactory.java
index c6a3e77..7252fc9 100644
--- a/src/main/java/com/fasterxml/jackson/databind/type/TypeFactory.java
+++ b/src/main/java/com/fasterxml/jackson/databind/type/TypeFactory.java
@@ -474,9 +474,12 @@
     {
         List<JavaType> expectedTypes = sourceType.getBindings().getTypeParameters();
         List<JavaType> actualTypes = actualType.getBindings().getTypeParameters();
-        for (int i = 0, len = expectedTypes.size(); i < len; ++i) {
+
+        final int actCount = actualTypes.size();
+
+        for (int i = 0, expCount = expectedTypes.size(); i < expCount; ++i) {
             JavaType exp = expectedTypes.get(i);
-            JavaType act = actualTypes.get(i);
+            JavaType act = (i < actCount) ? actualTypes.get(i) : unknownType();
 
             if (!_verifyAndResolvePlaceholders(exp, act)) {
                 // 14-May-2018, tatu: As per [databind#2034] it seems we better relax assignment
@@ -505,7 +508,7 @@
                     }
                 }
                 return String.format("Type parameter #%d/%d differs; can not specialize %s with %s",
-                        (i+1), len, exp.toCanonical(), act.toCanonical());
+                        (i+1), expCount, exp.toCanonical(), act.toCanonical());
             }
         }
         return null;
diff --git a/src/test/java/com/fasterxml/jackson/databind/jsontype/SubTypeResolution1964Test.java b/src/test/java/com/fasterxml/jackson/databind/jsontype/SubTypeResolutionTest.java
similarity index 70%
rename from src/test/java/com/fasterxml/jackson/databind/jsontype/SubTypeResolution1964Test.java
rename to src/test/java/com/fasterxml/jackson/databind/jsontype/SubTypeResolutionTest.java
index fa9ef01..1b29a77 100644
--- a/src/test/java/com/fasterxml/jackson/databind/jsontype/SubTypeResolution1964Test.java
+++ b/src/test/java/com/fasterxml/jackson/databind/jsontype/SubTypeResolutionTest.java
@@ -3,10 +3,13 @@
 import java.util.*;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
 import com.fasterxml.jackson.databind.*;
 
 /**
- * Test for [databind#1964], wherein slightly incompatible type hierarchy,
+ * Originally test for [databind#1964], wherein slightly incompatible type hierarchy,
  * where `Map` key is downcast from `String` to `Object` (via use of "raw"
  * types to force compiler to ignore incompatibility) causes exception
  * during serialization. Although ideally code would not force round peg
@@ -14,7 +17,7 @@
  * such downcast just for Map key types (for now at least).
  */
 @SuppressWarnings("serial")
-public class SubTypeResolution1964Test extends BaseMapTest
+public class SubTypeResolutionTest extends BaseMapTest
 {
     // [databind#1964]
     static class AccessModel {
@@ -65,7 +68,26 @@
     static class MetaAttribute<M, V, B> extends AbstractMetaValue<M, V, B> {
         public MetaAttribute() { }
       }
-    
+
+    // [databind#2632]: fail to specialize type-erased
+    @SuppressWarnings("rawtypes")
+    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
+    @JsonSubTypes(value = {
+                    @JsonSubTypes.Type(value = Either.Left.class, name = "left"),
+                    @JsonSubTypes.Type(value = Either.Right.class, name = "right")
+    })
+    static class Either<L, R> {
+        static class Left<T> extends Either {   }
+        static class Right<T> extends Either {  }
+    }
+
+    static class Foo {
+        @SuppressWarnings("unchecked")
+        public Either<String, String> getEither() {
+            return new Either.Right<String>();
+        }
+    }
+
     /*
     /**********************************************************************
     /* Unit tests
@@ -103,4 +125,21 @@
         // ... could/should verify more, perhaps, but for now let it be.
         assertNotNull(jsonStr);
     }
+
+    // [databind#2632]: fail to specialize type-erased
+    public void testSpecializeIncompatibleRawType() throws Exception
+    {
+        // 27-Feb-2020, tatu: First things first; incompatible typing should
+        //     cause reasonable exception
+        //  ... although since it's writing, perhaps should NOT fail at all?
+        String json;
+
+        try {
+            json = MAPPER.writeValueAsString(new Foo());
+            assertNotNull(json);
+            fail("Should not (yet?) pass");
+        } catch (JsonMappingException e) {
+            verifyException(e, "Failed to specialize base type ");
+        }
+    }
 }