public class Widget {
    private boolean primitive;
    private Widget recursiveType;
    private Final finalType;
    private Pair<? extends Widget, ? super Widget> generics;
    private int[][] multiDimensionalArray;

    public Widget() {
    }

    public boolean isPrimitive() {
        return primitive;
    }

    public Widget getRecursiveType() {
        return recursiveType;
    }

    public Widget getFinalType() {
        return recursiveType;
    }

    public Pair<? extends Widget, ? super Widget> getGenerics() {
        return generics;
    }

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

    public class Pair<U, V> {
    }

    public final class Final {
    }
}

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> {
    }
}

--- 
+++ 
@@ -1,8 +1,8 @@
 public class Widget {
     private boolean primitive;
-    private Widget simpleObject;
-    private Pair<? extends Pair<? extends Widget, ? super Widget>, ?> nestedGenerics;
-    private Pair<Widget, ?>[] arrayOfGeneric;
+    private Widget recursiveType;
+    private Final finalType;
+    private Pair<? extends Widget, ? super Widget> generics;
     private int[][] multiDimensionalArray;
 
     public Widget() {
@@ -12,16 +12,16 @@
         return primitive;
     }
 
-    public Widget getSimpleObject() {
-        return simpleObject;
+    public Widget getRecursiveType() {
+        return recursiveType;
     }
 
-    public Pair<? extends Pair<? extends Widget, ? super Widget>, ?> getNestedGenerics() {
-        return nestedGenerics;
+    public Widget getFinalType() {
+        return recursiveType;
     }
 
-    public Pair<Widget, ?>[] getArrayOfGeneric() {
-        return arrayOfGeneric;
+    public Pair<? extends Widget, ? super Widget> getGenerics() {
+        return generics;
     }
 
     public int[][] getMultiDimensionalArray() {
@@ -30,4 +30,7 @@
 
     public class Pair<U, V> {
     }
+
+    public final class Final {
+    }
 }
Update property-types test case with more realistic types.
