diff --git a/bind/testdata/java.go b/bind/testdata/java.go
index 6e06b4e..8550582 100644
--- a/bind/testdata/java.go
+++ b/bind/testdata/java.go
@@ -6,7 +6,6 @@
 
 import (
 	"Java/java/lang"
-	"Java/java/lang/Character"
 )
 
 type (
@@ -14,5 +13,4 @@
 	L lang.Long
 	O lang.Object
 	R lang.Runnable
-	S Character.Subset // Inner class
 )
diff --git a/bind/testdata/java.go.golden b/bind/testdata/java.go.golden
index ee66846..6321418 100644
--- a/bind/testdata/java.go.golden
+++ b/bind/testdata/java.go.golden
@@ -35,7 +35,6 @@
 type Long Java.Java_lang_Long
 type Object Java.Java_lang_Object
 type Runnable Java.Java_lang_Runnable
-type Character Java.Java_lang_Character
 // File is generated by gobind. Do not edit.
 
 package Long
@@ -96,104 +95,6 @@
 
 // File is generated by gobind. Do not edit.
 
-package Character
-
-import "Java"
-
-const _ = Java.Dummy
-
-type Subset Java.Java_lang_Character_Subset
-const (
-	MIN_RADIX = 2
-	MAX_RADIX = 36
-	UNASSIGNED = 0
-	UPPERCASE_LETTER = 1
-	LOWERCASE_LETTER = 2
-	TITLECASE_LETTER = 3
-	MODIFIER_LETTER = 4
-	OTHER_LETTER = 5
-	NON_SPACING_MARK = 6
-	ENCLOSING_MARK = 7
-	COMBINING_SPACING_MARK = 8
-	DECIMAL_DIGIT_NUMBER = 9
-	LETTER_NUMBER = 10
-	OTHER_NUMBER = 11
-	SPACE_SEPARATOR = 12
-	LINE_SEPARATOR = 13
-	PARAGRAPH_SEPARATOR = 14
-	CONTROL = 15
-	FORMAT = 16
-	PRIVATE_USE = 18
-	SURROGATE = 19
-	DASH_PUNCTUATION = 20
-	START_PUNCTUATION = 21
-	END_PUNCTUATION = 22
-	CONNECTOR_PUNCTUATION = 23
-	OTHER_PUNCTUATION = 24
-	MATH_SYMBOL = 25
-	CURRENCY_SYMBOL = 26
-	MODIFIER_SYMBOL = 27
-	OTHER_SYMBOL = 28
-	INITIAL_QUOTE_PUNCTUATION = 29
-	FINAL_QUOTE_PUNCTUATION = 30
-	DIRECTIONALITY_UNDEFINED = -1
-	DIRECTIONALITY_LEFT_TO_RIGHT = 0
-	DIRECTIONALITY_RIGHT_TO_LEFT = 1
-	DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC = 2
-	DIRECTIONALITY_EUROPEAN_NUMBER = 3
-	DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR = 4
-	DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR = 5
-	DIRECTIONALITY_ARABIC_NUMBER = 6
-	DIRECTIONALITY_COMMON_NUMBER_SEPARATOR = 7
-	DIRECTIONALITY_NONSPACING_MARK = 8
-	DIRECTIONALITY_BOUNDARY_NEUTRAL = 9
-	DIRECTIONALITY_PARAGRAPH_SEPARATOR = 10
-	DIRECTIONALITY_SEGMENT_SEPARATOR = 11
-	DIRECTIONALITY_WHITESPACE = 12
-	DIRECTIONALITY_OTHER_NEUTRALS = 13
-	DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING = 14
-	DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE = 15
-	DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING = 16
-	DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE = 17
-	DIRECTIONALITY_POP_DIRECTIONAL_FORMAT = 18
-	DIRECTIONALITY_LEFT_TO_RIGHT_ISOLATE = 19
-	DIRECTIONALITY_RIGHT_TO_LEFT_ISOLATE = 20
-	DIRECTIONALITY_FIRST_STRONG_ISOLATE = 21
-	DIRECTIONALITY_POP_DIRECTIONAL_ISOLATE = 22
-	MIN_SUPPLEMENTARY_CODE_POINT = 65536
-	MIN_CODE_POINT = 0
-	MAX_CODE_POINT = 1114111
-	SIZE = 16
-	BYTES = 2
-)
-
-var (
-	// Cast takes a proxy for a Java object and converts it to a java.lang.Character proxy.
-	// Cast panics if the argument is not a proxy or if the underlying object does
-	// not extend or implement java.lang.Character.
-	Cast func(v interface{}) Java.Java_lang_Character
-)
-
-// File is generated by gobind. Do not edit.
-
-package Subset
-
-import "Java"
-
-const _ = Java.Dummy
-
-const (
-)
-
-var (
-	// Cast takes a proxy for a Java object and converts it to a java.lang.Character.Subset proxy.
-	// Cast panics if the argument is not a proxy or if the underlying object does
-	// not extend or implement java.lang.Character.Subset.
-	Cast func(v interface{}) Java.Java_lang_Character_Subset
-)
-
-// File is generated by gobind. Do not edit.
-
 package Java
 
 // Used to silence this package not used errors
@@ -214,14 +115,6 @@
 type Java_lang_Runnable interface {
 }
 
-type Java_lang_Character interface {
-	ToString() string
-}
-
-type Java_lang_Character_Subset interface {
-	ToString() string
-}
-
 // File is generated by gobind. Do not edit.
 
 package main
@@ -243,8 +136,6 @@
 import "Java/java/lang/Long"
 import "Java/java/lang/Object"
 import "Java/java/lang/Runnable"
-import "Java/java/lang/Character"
-import "Java/java/lang/Character/Subset"
 import "unsafe"
 
 import "reflect"
@@ -265,8 +156,6 @@
 	init_java_lang_Long()
 	init_java_lang_Object()
 	init_java_lang_Runnable()
-	init_java_lang_Character()
-	init_java_lang_Character_Subset()
 }
 
 var class_java_lang_Float C.jclass
@@ -417,88 +306,6 @@
 
 func (p *proxy_class_java_lang_Runnable) Bind_proxy_refnum__() int32 { return (*_seq.Ref)(p).Bind_IncNum() }
 
-var class_java_lang_Character C.jclass
-
-func init_java_lang_Character() {
-	cls := C.CString("java/lang/Character")
-	clazz := C.go_seq_find_class(cls)
-	C.free(unsafe.Pointer(cls))
-	if uintptr(clazz) == 0 {
-		return
-	}
-	class_java_lang_Character = clazz
-	Character.Cast = func(v interface{}) Java.Java_lang_Character {
-		t := reflect.TypeOf((*proxy_class_java_lang_Character)(nil))
-		cv := reflect.ValueOf(v).Convert(t).Interface().(*proxy_class_java_lang_Character)
-		ref := C.jint(_seq.ToRefNum(cv))
-		if C.go_seq_isinstanceof(ref, class_java_lang_Character) != 1 {
-			panic(fmt.Errorf("%T is not an instance of %s", v, "java.lang.Character"))
-		}
-		return cv
-	}
-}
-
-type proxy_class_java_lang_Character _seq.Ref
-
-func (p *proxy_class_java_lang_Character) Bind_proxy_refnum__() int32 { return (*_seq.Ref)(p).Bind_IncNum() }
-
-func (p *proxy_class_java_lang_Character) ToString() string {
-	res := C.cproxy_java_lang_Character_toString(C.jint(p.Bind_proxy_refnum__()))
-	_res := decodeString(res.res)
-	var _exc error
-	_exc_ref := _seq.FromRefNum(int32(res.exc))
-	if _exc_ref != nil {
-		if res.exc < 0 { // go object
-			_exc = _exc_ref.Get().(error)
-		} else { // foreign object
-			_exc = (*proxy_error)(_exc_ref)
-		}
-	}
-	if (_exc != nil) { panic(_exc) }
-	return _res
-}
-
-var class_java_lang_Character_Subset C.jclass
-
-func init_java_lang_Character_Subset() {
-	cls := C.CString("java/lang/Character$Subset")
-	clazz := C.go_seq_find_class(cls)
-	C.free(unsafe.Pointer(cls))
-	if uintptr(clazz) == 0 {
-		return
-	}
-	class_java_lang_Character_Subset = clazz
-	Subset.Cast = func(v interface{}) Java.Java_lang_Character_Subset {
-		t := reflect.TypeOf((*proxy_class_java_lang_Character_Subset)(nil))
-		cv := reflect.ValueOf(v).Convert(t).Interface().(*proxy_class_java_lang_Character_Subset)
-		ref := C.jint(_seq.ToRefNum(cv))
-		if C.go_seq_isinstanceof(ref, class_java_lang_Character_Subset) != 1 {
-			panic(fmt.Errorf("%T is not an instance of %s", v, "java.lang.Character.Subset"))
-		}
-		return cv
-	}
-}
-
-type proxy_class_java_lang_Character_Subset _seq.Ref
-
-func (p *proxy_class_java_lang_Character_Subset) Bind_proxy_refnum__() int32 { return (*_seq.Ref)(p).Bind_IncNum() }
-
-func (p *proxy_class_java_lang_Character_Subset) ToString() string {
-	res := C.cproxy_java_lang_Character_Subset_toString(C.jint(p.Bind_proxy_refnum__()))
-	_res := decodeString(res.res)
-	var _exc error
-	_exc_ref := _seq.FromRefNum(int32(res.exc))
-	if _exc_ref != nil {
-		if res.exc < 0 { // go object
-			_exc = _exc_ref.Get().(error)
-		} else { // foreign object
-			_exc = (*proxy_error)(_exc_ref)
-		}
-	}
-	if (_exc != nil) { panic(_exc) }
-	return _res
-}
-
 // Package main is an autogenerated binder stub for package java.
 //   gobind -lang=go java
 //
@@ -582,22 +389,3 @@
 type proxyjava_R _seq.Ref
 
 func (p *proxyjava_R) Bind_proxy_refnum__() int32 { return (*_seq.Ref)(p).Bind_IncNum() }
-
-//export proxyjava_S_ToString
-func proxyjava_S_ToString(refnum C.int32_t) C.nstring {
-	ref := _seq.FromRefNum(int32(refnum))
-	v := ref.Get().(java.S)
-	res_0 := v.ToString()
-	_res_0 := encodeString(res_0)
-	return _res_0
-}
-
-type proxyjava_S _seq.Ref
-
-func (p *proxyjava_S) Bind_proxy_refnum__() int32 { return (*_seq.Ref)(p).Bind_IncNum() }
-
-func (p *proxyjava_S) ToString() string {
-	res := C.cproxyjava_S_ToString(C.int32_t(p.Bind_proxy_refnum__()))
-	_res := decodeString(res)
-	return _res
-}
diff --git a/bind/testdata/java.java.c.golden b/bind/testdata/java.java.c.golden
index 99b5e7c..8bbe285 100644
--- a/bind/testdata/java.java.c.golden
+++ b/bind/testdata/java.java.c.golden
@@ -11,13 +11,9 @@
 static jclass class_java_lang_Object;
 static jmethodID m_java_lang_Object_toString;
 static jclass class_java_lang_Runnable;
-static jclass class_java_lang_Character;
-static jmethodID m_java_lang_Character_toString;
-static jclass class_java_lang_Character_Subset;
-static jmethodID m_java_lang_Character_Subset_toString;
 
 void init_proxies() {
-	JNIEnv *env = go_seq_push_local_frame(6);
+	JNIEnv *env = go_seq_push_local_frame(4);
 	jclass clazz;
 	clazz = go_seq_find_class("java/lang/Float");
 	if (clazz != NULL) {
@@ -38,16 +34,6 @@
 	if (clazz != NULL) {
 		class_java_lang_Runnable = (*env)->NewGlobalRef(env, clazz);
 	}
-	clazz = go_seq_find_class("java/lang/Character");
-	if (clazz != NULL) {
-		class_java_lang_Character = (*env)->NewGlobalRef(env, clazz);
-		m_java_lang_Character_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
-	}
-	clazz = go_seq_find_class("java/lang/Character$Subset");
-	if (clazz != NULL) {
-		class_java_lang_Character_Subset = (*env)->NewGlobalRef(env, clazz);
-		m_java_lang_Character_Subset_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
-	}
 	go_seq_pop_local_frame(env);
 }
 
@@ -99,38 +85,6 @@
 	return __res;
 }
 
-ret_nstring cproxy_java_lang_Character_toString(jint this) {
-	JNIEnv *env = go_seq_push_local_frame(1);
-	// Must be a Java object
-	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
-	jstring res = (*env)->CallObjectMethod(env, _this, m_java_lang_Character_toString);
-	jobject _exc = go_seq_get_exception(env);
-	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
-	if (_exc != NULL) {
-		res = NULL;
-	}
-	nstring _res = go_seq_from_java_string(env, res);
-	go_seq_pop_local_frame(env);
-	ret_nstring __res = {_res, _exc_ref};
-	return __res;
-}
-
-ret_nstring cproxy_java_lang_Character_Subset_toString(jint this) {
-	JNIEnv *env = go_seq_push_local_frame(1);
-	// Must be a Java object
-	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
-	jstring res = (*env)->CallObjectMethod(env, _this, m_java_lang_Character_Subset_toString);
-	jobject _exc = go_seq_get_exception(env);
-	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
-	if (_exc != NULL) {
-		res = NULL;
-	}
-	nstring _res = go_seq_from_java_string(env, res);
-	go_seq_pop_local_frame(env);
-	ret_nstring __res = {_res, _exc_ref};
-	return __res;
-}
-
 // JNI functions for the Go <=> Java bridge.
 //   gobind -lang=java java
 //
@@ -153,9 +107,6 @@
 static jmethodID mid_O_ToString;
 jclass proxy_class_java_R;
 jmethodID proxy_class_java_R_cons;
-jclass proxy_class_java_S;
-jmethodID proxy_class_java_S_cons;
-static jmethodID mid_S_ToString;
 
 JNIEXPORT void JNICALL
 Java_java_Java__1init(JNIEnv *env, jclass _unused) {
@@ -183,12 +134,6 @@
     proxy_class_java_R_cons = (*env)->GetMethodID(env, clazz, "<init>", "(I)V");
     clazz = (*env)->FindClass(env, "java/R");
     
-    clazz = (*env)->FindClass(env, "java/Java$proxyS");
-    proxy_class_java_S = (*env)->NewGlobalRef(env, clazz);
-    proxy_class_java_S_cons = (*env)->GetMethodID(env, clazz, "<init>", "(I)V");
-    clazz = (*env)->FindClass(env, "java/S");
-    mid_S_ToString = (*env)->GetMethodID(env, clazz, "toString", "()Ljava/lang/String;");
-    
 }
 
 JNIEXPORT jstring JNICALL
@@ -242,20 +187,3 @@
     return _res;
 }
 
-JNIEXPORT jstring JNICALL
-Java_java_Java_00024proxyS_toString(JNIEnv* env, jobject __this__) {
-    int32_t o = go_seq_to_refnum_go(env, __this__);
-    nstring r0 = proxyjava_S_ToString(o);
-    jstring _r0 = go_seq_to_java_string(env, r0);
-    return _r0;
-}
-
-nstring cproxyjava_S_ToString(int32_t refnum) {
-    JNIEnv *env = go_seq_push_local_frame(0);
-    jobject o = go_seq_from_refnum(env, refnum, proxy_class_java_S, proxy_class_java_S_cons);
-    jstring res = (*env)->CallObjectMethod(env, o, mid_S_ToString);
-    nstring _res = go_seq_from_java_string(env, res);
-    go_seq_pop_local_frame(env);
-    return _res;
-}
-
diff --git a/bind/testdata/java.java.golden b/bind/testdata/java.java.golden
index e905d43..bbbef88 100644
--- a/bind/testdata/java.java.golden
+++ b/bind/testdata/java.java.golden
@@ -49,19 +49,6 @@
     
 }
 
-// Java class java.S is a proxy for talking to a Go program.
-//   gobind -lang=java java
-//
-// File is generated by gobind. Do not edit.
-package java;
-
-import go.Seq;
-
-public interface S extends R {
-    public String toString();
-    
-}
-
 // Java class java.Java is a proxy for talking to a Go program.
 //   gobind -lang=java java
 //
@@ -130,18 +117,6 @@
         proxyR(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
         
     }
-    private static final class proxyS implements Seq.Proxy, S {
-        private final int refnum;
-        
-        @Override public final int incRefnum() {
-              Seq.incGoRef(refnum, this);
-              return refnum;
-        }
-        
-        proxyS(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
-        
-        public native String toString();
-    }
     
     
 }
diff --git a/bind/testdata/java.java.h.golden b/bind/testdata/java.java.h.golden
index 3d9671a..58eaaa5 100644
--- a/bind/testdata/java.java.h.golden
+++ b/bind/testdata/java.java.h.golden
@@ -49,8 +49,6 @@
 extern ret_nstring cproxy_java_lang_Float_toString(jint this);
 extern ret_nstring cproxy_java_lang_Long_toString(jint this);
 extern ret_nstring cproxy_java_lang_Object_toString(jint this);
-extern ret_nstring cproxy_java_lang_Character_toString(jint this);
-extern ret_nstring cproxy_java_lang_Character_Subset_toString(jint this);
 // JNI function headers for the Go <=> Java bridge.
 //   gobind -lang=java java
 //
@@ -79,9 +77,4 @@
 extern jclass proxy_class_java_R;
 extern jmethodID proxy_class_java_R_cons;
 
-extern jclass proxy_class_java_S;
-extern jmethodID proxy_class_java_S_cons;
-
-nstring cproxyjava_S_ToString(int32_t refnum);
-
 #endif
