public class Widget {
    private boolean primitive;
    private Widget simpleObject;
    private Pair<? extends Pair<? extends Widget, ? super Widget>, ?> nestedGenerics;
    private Pair<Widget, ?>[] arrayOfGeneric;
    private int[][] multiDimensionalArray;

    public Widget() {
    }

    public boolean isPrimitive() {
        return primitive;
    }

    public Widget getSimpleObject() {
        return simpleObject;
    }

    public Pair<? extends Pair<? extends Widget, ? super Widget>, ?> getNestedGenerics() {
        return nestedGenerics;
    }

    public Pair<Widget, ?>[] getArrayOfGeneric() {
        return arrayOfGeneric;
    }

    public int[][] getMultiDimensionalArray() {
        return multiDimensionalArray;
    }

    public class Pair<U, V> {
    }
}

@@ -65,28 +65,29 @@
  Widget 
-simpleObject
+recursiveType
 ;%0A    pr
@@ -92,30 +92,44 @@
 private 
-Pair%3C? extends
+Final finalType;%0A    private
  Pair%3C? 
@@ -163,73 +163,17 @@
 get%3E
-, ?%3E nestedGenerics;%0A    private Pair%3CWidget, ?%3E%5B%5D arrayOfG
+ g
 eneric
+s
 ;%0A  
@@ -336,20 +336,21 @@
  get
-SimpleObject
+RecursiveType
 () %7B
@@ -369,20 +369,21 @@
 urn 
-simpleObject
+recursiveType
 ;%0A  
@@ -402,83 +402,27 @@
 lic 
-Pair%3C? extends Pair%3C? extends Widget, ? super Widget%3E, ?%3E getNestedGenerics
+Widget getFinalType
 () %7B
@@ -441,22 +441,21 @@
 urn 
-nestedGenerics
+recursiveType
 ;%0A  
@@ -479,38 +479,53 @@
 air%3C
-Widget, ?%3E%5B%5D getArrayOf
+? extends Widget, ? super Widget%3E get
 Generic
+s
 () %7B
@@ -544,22 +544,16 @@
 urn 
-arrayOfG
+g
 eneric
+s
 ;%0A  
@@ -685,11 +685,49 @@
  %7B%0A    %7D
+%0A%0A    public final class Final %7B%0A    %7D
 %0A%7D%0A

Update property-types test case with more realistic types.