diff --git a/bind/genjava.go b/bind/genjava.go
index dd3cf18..8991466 100644
--- a/bind/genjava.go
+++ b/bind/genjava.go
@@ -205,10 +205,10 @@
 func (g *JavaGen) ClassNames() []string {
 	var names []string
 	for _, s := range g.structs {
-		names = append(names, s.obj.Name())
+		names = append(names, g.javaTypeName(s.obj.Name()))
 	}
 	for _, iface := range g.interfaces {
-		names = append(names, iface.obj.Name())
+		names = append(names, g.javaTypeName(iface.obj.Name()))
 	}
 	return names
 }
@@ -242,7 +242,7 @@
 	if g.Pkg != nil {
 		pkgPath = g.Pkg.Path()
 	}
-	n := s.obj.Name()
+	n := g.javaTypeName(s.obj.Name())
 	g.Printf(javaPreamble, g.javaPkgName(g.Pkg), n, g.gobindOpts(), pkgPath)
 
 	fields := exportedFields(s.t)
@@ -254,7 +254,7 @@
 		impls = append(impls, "Seq.GoObject")
 		for _, cls := range jinf.supers {
 			if cls.Interface {
-				impls = append(impls, cls.Name)
+				impls = append(impls, g.javaTypeName(cls.Name))
 			}
 		}
 	} else {
@@ -266,7 +266,12 @@
 		if types.AssignableTo(pT, iface.obj.Type()) {
 			n := iface.obj.Name()
 			if p := iface.obj.Pkg(); p != g.Pkg {
+				if n == JavaClassName(p) {
+					n = n + "_"
+				}
 				n = fmt.Sprintf("%s.%s", g.javaPkgName(p), n)
+			} else {
+				n = g.javaTypeName(n)
 			}
 			impls = append(impls, n)
 		}
@@ -277,7 +282,7 @@
 	g.Printf("public final class %s", n)
 	if jinf != nil {
 		if jinf.extends != nil {
-			g.Printf(" extends %s", jinf.extends.Name)
+			g.Printf(" extends %s", g.javaTypeName(jinf.extends.Name))
 		}
 	}
 	if len(impls) > 0 {
@@ -350,6 +355,16 @@
 	g.Printf("}\n\n")
 }
 
+// javaTypeName returns the class name of a given Go type name. If
+// the type name clashes with the package class name, an underscore is
+// appended.
+func (g *JavaGen) javaTypeName(n string) string {
+	if n == JavaClassName(g.Pkg) {
+		return n + "_"
+	}
+	return n
+}
+
 func (g *JavaGen) javadoc(doc string) {
 	if doc == "" {
 		return
@@ -514,7 +529,7 @@
 	if g.Pkg != nil {
 		pkgPath = g.Pkg.Path()
 	}
-	g.Printf(javaPreamble, g.javaPkgName(g.Pkg), iface.obj.Name(), g.gobindOpts(), pkgPath)
+	g.Printf(javaPreamble, g.javaPkgName(g.Pkg), g.javaTypeName(iface.obj.Name()), g.gobindOpts(), pkgPath)
 
 	var exts []string
 	numM := iface.t.NumMethods()
@@ -523,14 +538,19 @@
 		if other.t.NumMethods() < numM && types.AssignableTo(iface.t, other.t) {
 			n := other.obj.Name()
 			if p := other.obj.Pkg(); p != g.Pkg {
+				if n == JavaClassName(p) {
+					n = n + "_"
+				}
 				n = fmt.Sprintf("%s.%s", g.javaPkgName(p), n)
+			} else {
+				n = g.javaTypeName(n)
 			}
 			exts = append(exts, n)
 		}
 	}
 	doc := g.docs[iface.obj.Name()]
 	g.javadoc(doc.Doc())
-	g.Printf("public interface %s", iface.obj.Name())
+	g.Printf("public interface %s", g.javaTypeName(iface.obj.Name()))
 	if len(exts) > 0 {
 		g.Printf(" extends %s", strings.Join(exts, ", "))
 	}
@@ -675,10 +695,14 @@
 			break
 		}
 		// TODO(crawshaw): more checking here
+		clsName := n.Name()
 		if nPkg != g.Pkg {
-			return fmt.Sprintf("%s.%s", g.javaPkgName(nPkg), n.Name())
+			if clsName == JavaClassName(nPkg) {
+				clsName += "_"
+			}
+			return fmt.Sprintf("%s.%s", g.javaPkgName(nPkg), clsName)
 		} else {
-			return n.Name()
+			return g.javaTypeName(clsName)
 		}
 	default:
 		g.errorf("unsupported javaType: %#+v, %s\n", T, T)
@@ -713,10 +737,10 @@
 		if proxy {
 			g.Printf(g.className())
 			// 0024 is the mangled form of $, for naming inner classes.
-			g.Printf("_00024")
-			g.Printf("proxy")
+			g.Printf("_00024proxy%s", sName)
+		} else {
+			g.Printf(java.JNIMangle(g.javaTypeName(sName)))
 		}
-		g.Printf("%s", sName)
 	} else {
 		g.Printf(g.className())
 	}
@@ -1037,9 +1061,10 @@
 		g.Printf("// skipped field %s with unsupported type: %T\n\n", o.Name(), t)
 		return
 	}
+	n := java.JNIMangle(g.javaTypeName(o.Name()))
 	// setter
 	g.Printf("JNIEXPORT void JNICALL\n")
-	g.Printf("Java_%s_%s_set%s(JNIEnv *env, jobject this, %s v) {\n", g.jniPkgName(), o.Name(), f.Name(), g.jniType(f.Type()))
+	g.Printf("Java_%s_%s_set%s(JNIEnv *env, jobject this, %s v) {\n", g.jniPkgName(), n, f.Name(), g.jniType(f.Type()))
 	g.Indent()
 	g.Printf("int32_t o = go_seq_to_refnum_go(env, this);\n")
 	g.genJavaToC("v", f.Type(), modeRetained)
@@ -1050,7 +1075,7 @@
 
 	// getter
 	g.Printf("JNIEXPORT %s JNICALL\n", g.jniType(f.Type()))
-	g.Printf("Java_%s_%s_get%s(JNIEnv *env, jobject this) {\n", g.jniPkgName(), o.Name(), f.Name())
+	g.Printf("Java_%s_%s_get%s(JNIEnv *env, jobject this) {\n", g.jniPkgName(), n, f.Name())
 	g.Indent()
 	g.Printf("int32_t o = go_seq_to_refnum_go(env, this);\n")
 	g.Printf("%s r0 = ", g.cgoType(f.Type()))
@@ -1066,9 +1091,10 @@
 		g.Printf("// skipped variable %s with unsupported type: %T\n\n", o.Name(), t)
 		return
 	}
+	n := java.JNIMangle(g.javaTypeName(o.Name()))
 	// setter
 	g.Printf("JNIEXPORT void JNICALL\n")
-	g.Printf("Java_%s_%s_set%s(JNIEnv *env, jclass clazz, %s v) {\n", g.jniPkgName(), g.className(), o.Name(), g.jniType(o.Type()))
+	g.Printf("Java_%s_%s_set%s(JNIEnv *env, jclass clazz, %s v) {\n", g.jniPkgName(), g.className(), n, g.jniType(o.Type()))
 	g.Indent()
 	g.genJavaToC("v", o.Type(), modeRetained)
 	g.Printf("var_set%s_%s(_v);\n", g.pkgPrefix, o.Name())
@@ -1078,7 +1104,7 @@
 
 	// getter
 	g.Printf("JNIEXPORT %s JNICALL\n", g.jniType(o.Type()))
-	g.Printf("Java_%s_%s_get%s(JNIEnv *env, jclass clazz) {\n", g.jniPkgName(), g.className(), o.Name())
+	g.Printf("Java_%s_%s_get%s(JNIEnv *env, jclass clazz) {\n", g.jniPkgName(), g.className(), n)
 	g.Indent()
 	g.Printf("%s r0 = ", g.cgoType(o.Type()))
 	g.Printf("var_get%s_%s();\n", g.pkgPrefix, o.Name())
@@ -1096,7 +1122,7 @@
 	res := sig.Results()
 
 	g.Printf("JNIEXPORT jobject JNICALL\n")
-	g.Printf("Java_%s_%s_%s(JNIEnv *env, jclass clazz", g.jniPkgName(), sName, java.JNIMangle("__"+f.Name()))
+	g.Printf("Java_%s_%s_%s(JNIEnv *env, jclass clazz", g.jniPkgName(), java.JNIMangle(g.javaTypeName(sName)), java.JNIMangle("__"+f.Name()))
 	params := sig.Params()
 	for i := 0; i < params.Len(); i++ {
 		v := params.At(i)
@@ -1402,7 +1428,7 @@
 		}
 		g.errorf("unsupported pointer to type: %s", T)
 	case *types.Named:
-		return "L" + g.jniClassSigPrefix(T.Obj().Pkg()) + T.Obj().Name() + ";"
+		return "L" + g.jniClassSigPrefix(T.Obj().Pkg()) + g.javaTypeName(T.Obj().Name()) + ";"
 	default:
 		g.errorf("unsupported jniType: %#+v, %s\n", T, T)
 	}
@@ -1456,7 +1482,7 @@
 				continue
 			}
 		}
-		g.Printf("clazz = (*env)->FindClass(env, %q);\n", g.jniClassSigPrefix(s.obj.Pkg())+s.obj.Name())
+		g.Printf("clazz = (*env)->FindClass(env, %q);\n", g.jniClassSigPrefix(s.obj.Pkg())+g.javaTypeName(s.obj.Name()))
 		g.Printf("proxy_class_%s_%s = (*env)->NewGlobalRef(env, clazz);\n", g.pkgPrefix, s.obj.Name())
 		g.Printf("proxy_class_%s_%s_cons = (*env)->GetMethodID(env, clazz, \"<init>\", \"(Lgo/Seq$Ref;)V\");\n", g.pkgPrefix, s.obj.Name())
 	}
@@ -1472,7 +1498,7 @@
 			g.Printf("mid_error_Error = (*env)->GetMethodID(env, clazz, \"getMessage\", \"()Ljava/lang/String;\");\n")
 			continue
 		}
-		g.Printf("clazz = (*env)->FindClass(env, %q);\n", g.jniClassSigPrefix(pkg)+iface.obj.Name())
+		g.Printf("clazz = (*env)->FindClass(env, %q);\n", g.jniClassSigPrefix(pkg)+g.javaTypeName(iface.obj.Name()))
 		for _, m := range iface.summary.callable {
 			if !g.isSigSupported(m.Type()) {
 				g.Printf("// skipped method %s.%s with unsupported parameter or return types\n\n", iface.obj.Name(), m.Name())
@@ -1510,7 +1536,7 @@
 		}
 		if len(cons) == 0 && (jinf == nil || jinf.genNoargCon) {
 			g.Printf("JNIEXPORT jobject JNICALL\n")
-			g.Printf("Java_%s_%s_%s(JNIEnv *env, jclass clazz) {\n", g.jniPkgName(), sName, java.JNIMangle("__New"))
+			g.Printf("Java_%s_%s_%s(JNIEnv *env, jclass clazz) {\n", g.jniPkgName(), java.JNIMangle(g.javaTypeName(sName)), java.JNIMangle("__New"))
 			g.Indent()
 			g.Printf("int32_t refnum = new_%s_%s();\n", g.pkgPrefix, sName)
 			// Pass no proxy class so that the Seq.Ref is returned instead.
@@ -1578,7 +1604,7 @@
 		if isErrorType(iface.obj.Type()) {
 			g.Printf(" extends Exception")
 		}
-		g.Printf(" implements Seq.Proxy, %s {\n", n)
+		g.Printf(" implements Seq.Proxy, %s {\n", g.javaTypeName(n))
 		g.Indent()
 		g.genProxyImpl("proxy" + n)
 		g.Printf("proxy%s(Seq.Ref ref) { this.ref = ref; }\n\n", n)
diff --git a/bind/java/SeqTest.java b/bind/java/SeqTest.java
index 36f3169..ccaa813 100644
--- a/bind/java/SeqTest.java
+++ b/bind/java/SeqTest.java
@@ -588,4 +588,13 @@
   public void testTags() {
     assertEquals("Constant from a tagged file", 42, Testpkg.TaggedConst);
   }
+
+  public void testClassNameWithPackageName() {
+    testpkg.Testpkg_ o = new secondpkg.Secondpkg_();
+    secondpkg.Secondpkg_ o2 = Secondpkg.newSecondpkg();
+    o2.m();
+    o2.setV("hi");
+    assertEquals(o2.getV(), "hi");
+    Testpkg.clashingParameterFromOtherPackage(o2);
+  }
 }
diff --git a/bind/testdata/interfaces.go b/bind/testdata/interfaces.go
index 0eaa99a..9e2da3a 100644
--- a/bind/testdata/interfaces.go
+++ b/bind/testdata/interfaces.go
@@ -62,3 +62,8 @@
 // not bound
 func F() seven  { return seven{} }
 func G(u seven) {}
+
+// Interfaces is an interface with the same name as its package.
+type Interfaces interface {
+	SomeMethod()
+}
diff --git a/bind/testdata/interfaces.go.golden b/bind/testdata/interfaces.go.golden
index 16baa81..a4700d6 100644
--- a/bind/testdata/interfaces.go.golden
+++ b/bind/testdata/interfaces.go.golden
@@ -112,6 +112,21 @@
 	return _res
 }
 
+//export proxyinterfaces_Interfaces_SomeMethod
+func proxyinterfaces_Interfaces_SomeMethod(refnum C.int32_t) {
+	ref := _seq.FromRefNum(int32(refnum))
+	v := ref.Get().(interfaces.Interfaces)
+	v.SomeMethod()
+}
+
+type proxyinterfaces_Interfaces _seq.Ref
+
+func (p *proxyinterfaces_Interfaces) Bind_proxy_refnum__() int32 { return (*_seq.Ref)(p).Bind_IncNum() }
+
+func (p *proxyinterfaces_Interfaces) SomeMethod() {
+	C.cproxyinterfaces_Interfaces_SomeMethod(C.int32_t(p.Bind_proxy_refnum__()))
+}
+
 //export proxyinterfaces_LargerI_AnotherFunc
 func proxyinterfaces_LargerI_AnotherFunc(refnum C.int32_t) {
 	ref := _seq.FromRefNum(int32(refnum))
diff --git a/bind/testdata/interfaces.java.c.golden b/bind/testdata/interfaces.java.c.golden
index 7c31204..0f11d5d 100644
--- a/bind/testdata/interfaces.java.c.golden
+++ b/bind/testdata/interfaces.java.c.golden
@@ -24,6 +24,9 @@
 jclass proxy_class_interfaces_I3;
 jmethodID proxy_class_interfaces_I3_cons;
 static jmethodID mid_I3_F;
+jclass proxy_class_interfaces_Interfaces;
+jmethodID proxy_class_interfaces_Interfaces_cons;
+static jmethodID mid_Interfaces_SomeMethod;
 jclass proxy_class_interfaces_LargerI;
 jmethodID proxy_class_interfaces_LargerI_cons;
 static jmethodID mid_LargerI_AnotherFunc;
@@ -68,6 +71,12 @@
     clazz = (*env)->FindClass(env, "interfaces/I3");
     mid_I3_F = (*env)->GetMethodID(env, clazz, "f", "()Linterfaces/I1;");
     
+    clazz = (*env)->FindClass(env, "interfaces/Interfaces$proxyInterfaces");
+    proxy_class_interfaces_Interfaces = (*env)->NewGlobalRef(env, clazz);
+    proxy_class_interfaces_Interfaces_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
+    clazz = (*env)->FindClass(env, "interfaces/Interfaces_");
+    mid_Interfaces_SomeMethod = (*env)->GetMethodID(env, clazz, "someMethod", "()V");
+    
     clazz = (*env)->FindClass(env, "interfaces/Interfaces$proxyLargerI");
     proxy_class_interfaces_LargerI = (*env)->NewGlobalRef(env, clazz);
     proxy_class_interfaces_LargerI_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
@@ -191,6 +200,19 @@
 }
 
 JNIEXPORT void JNICALL
+Java_interfaces_Interfaces_00024proxyInterfaces_someMethod(JNIEnv* env, jobject __this__) {
+    int32_t o = go_seq_to_refnum_go(env, __this__);
+    proxyinterfaces_Interfaces_SomeMethod(o);
+}
+
+void cproxyinterfaces_Interfaces_SomeMethod(int32_t refnum) {
+    JNIEnv *env = go_seq_push_local_frame(0);
+    jobject o = go_seq_from_refnum(env, refnum, proxy_class_interfaces_Interfaces, proxy_class_interfaces_Interfaces_cons);
+    (*env)->CallVoidMethod(env, o, mid_Interfaces_SomeMethod);
+    go_seq_pop_local_frame(env);
+}
+
+JNIEXPORT void JNICALL
 Java_interfaces_Interfaces_00024proxyLargerI_anotherFunc(JNIEnv* env, jobject __this__) {
     int32_t o = go_seq_to_refnum_go(env, __this__);
     proxyinterfaces_LargerI_AnotherFunc(o);
diff --git a/bind/testdata/interfaces.java.golden b/bind/testdata/interfaces.java.golden
index 6b95947..87402b7 100644
--- a/bind/testdata/interfaces.java.golden
+++ b/bind/testdata/interfaces.java.golden
@@ -73,6 +73,22 @@
     
 }
 
+// Java class interfaces.Interfaces_ is a proxy for talking to a Go program.
+//   gobind -lang=java interfaces
+//
+// File is generated by gobind. Do not edit.
+package interfaces;
+
+import go.Seq;
+
+/**
+ * Interfaces is an interface with the same name as its package.
+ */
+public interface Interfaces_ {
+    public void someMethod();
+    
+}
+
 // Java class interfaces.LargerI is a proxy for talking to a Go program.
 //   gobind -lang=java interfaces
 //
@@ -199,6 +215,19 @@
         
         public native I1 f();
     }
+    private static final class proxyInterfaces implements Seq.Proxy, Interfaces_ {
+        private final Seq.Ref ref;
+        
+        @Override public final int incRefnum() {
+              int refnum = ref.refnum;
+              Seq.incGoRef(refnum);
+              return refnum;
+        }
+        
+        proxyInterfaces(Seq.Ref ref) { this.ref = ref; }
+        
+        public native void someMethod();
+    }
     private static final class proxyLargerI implements Seq.Proxy, LargerI {
         private final Seq.Ref ref;
         
diff --git a/bind/testdata/interfaces.java.h.golden b/bind/testdata/interfaces.java.h.golden
index 05840e8..5d5f3f1 100644
--- a/bind/testdata/interfaces.java.h.golden
+++ b/bind/testdata/interfaces.java.h.golden
@@ -33,6 +33,11 @@
 
 int32_t cproxyinterfaces_I3_F(int32_t refnum);
 
+extern jclass proxy_class_interfaces_Interfaces;
+extern jmethodID proxy_class_interfaces_Interfaces_cons;
+
+void cproxyinterfaces_Interfaces_SomeMethod(int32_t refnum);
+
 extern jclass proxy_class_interfaces_LargerI;
 extern jmethodID proxy_class_interfaces_LargerI_cons;
 
diff --git a/bind/testdata/interfaces.objc.go.h.golden b/bind/testdata/interfaces.objc.go.h.golden
index 8452626..983de54 100644
--- a/bind/testdata/interfaces.objc.go.h.golden
+++ b/bind/testdata/interfaces.objc.go.h.golden
@@ -14,6 +14,8 @@
 
 int32_t cproxyinterfaces_I3_F(int32_t refnum);
 
+void cproxyinterfaces_Interfaces_SomeMethod(int32_t refnum);
+
 void cproxyinterfaces_LargerI_AnotherFunc(int32_t refnum);
 
 int32_t cproxyinterfaces_LargerI_Rand(int32_t refnum);
diff --git a/bind/testdata/interfaces.objc.h.golden b/bind/testdata/interfaces.objc.h.golden
index ca5c7a4..c54288e 100644
--- a/bind/testdata/interfaces.objc.h.golden
+++ b/bind/testdata/interfaces.objc.h.golden
@@ -18,6 +18,8 @@
 @protocol InterfacesI2;
 @protocol InterfacesI3;
 @class InterfacesI3;
+@protocol InterfacesInterfaces;
+@class InterfacesInterfaces;
 @protocol InterfacesLargerI;
 @class InterfacesLargerI;
 @protocol InterfacesSameI;
@@ -59,6 +61,10 @@
 - (InterfacesI1*)f;
 @end
 
+@protocol InterfacesInterfaces <NSObject>
+- (void)someMethod;
+@end
+
 @protocol InterfacesLargerI <NSObject>
 - (void)anotherFunc;
 - (int32_t)rand;
@@ -84,6 +90,8 @@
 
 @class InterfacesI3;
 
+@class InterfacesInterfaces;
+
 @class InterfacesLargerI;
 
 @class InterfacesSameI;
@@ -118,6 +126,17 @@
 - (InterfacesI1*)f;
 @end
 
+/**
+ * Interfaces is an interface with the same name as its package.
+ */
+@interface InterfacesInterfaces : NSObject <goSeqRefInterface, InterfacesInterfaces> {
+}
+@property(strong, readonly) id _ref;
+
+- (instancetype)initWithRef:(id)ref;
+- (void)someMethod;
+@end
+
 @interface InterfacesLargerI : NSObject <goSeqRefInterface, InterfacesLargerI> {
 }
 @property(strong, readonly) id _ref;
diff --git a/bind/testdata/interfaces.objc.m.golden b/bind/testdata/interfaces.objc.m.golden
index 7b5e1d9..54383df 100644
--- a/bind/testdata/interfaces.objc.m.golden
+++ b/bind/testdata/interfaces.objc.m.golden
@@ -116,6 +116,23 @@
 @end
 
 
+@implementation InterfacesInterfaces {
+}
+
+- (instancetype)initWithRef:(id)ref {
+	self = [super init];
+	if (self) { __ref = ref; }
+	return self;
+}
+
+- (void)someMethod {
+	int32_t refnum = go_seq_go_to_refnum(self._ref);
+	proxyinterfaces_Interfaces_SomeMethod(refnum);
+}
+
+@end
+
+
 @implementation InterfacesLargerI {
 }
 
@@ -287,6 +304,13 @@
 	}
 }
 
+void cproxyinterfaces_Interfaces_SomeMethod(int32_t refnum) {
+	@autoreleasepool {
+		InterfacesInterfaces* o = go_seq_objc_from_refnum(refnum);
+		[o someMethod];
+	}
+}
+
 void cproxyinterfaces_LargerI_AnotherFunc(int32_t refnum) {
 	@autoreleasepool {
 		InterfacesLargerI* o = go_seq_objc_from_refnum(refnum);
diff --git a/bind/testdata/structs.go b/bind/testdata/structs.go
index 2505062..5974bdc 100644
--- a/bind/testdata/structs.go
+++ b/bind/testdata/structs.go
@@ -38,3 +38,9 @@
 func (_ *S2) String() string {
 	return ""
 }
+
+// Structs is a struct with the same name as its package.
+type Structs struct{}
+
+func (_ *Structs) M() {
+}
diff --git a/bind/testdata/structs.go.golden b/bind/testdata/structs.go.golden
index 49e366f..817ec5d 100644
--- a/bind/testdata/structs.go.golden
+++ b/bind/testdata/structs.go.golden
@@ -102,6 +102,18 @@
 	return C.int32_t(_seq.ToRefNum(new(structs.S2)))
 }
 
+//export proxystructs_Structs_M
+func proxystructs_Structs_M(refnum C.int32_t) {
+	ref := _seq.FromRefNum(int32(refnum))
+	v := ref.Get().(*structs.Structs)
+	v.M()
+}
+
+//export new_structs_Structs
+func new_structs_Structs() C.int32_t {
+	return C.int32_t(_seq.ToRefNum(new(structs.Structs)))
+}
+
 //export proxystructs_I_M
 func proxystructs_I_M(refnum C.int32_t) {
 	ref := _seq.FromRefNum(int32(refnum))
diff --git a/bind/testdata/structs.java.c.golden b/bind/testdata/structs.java.c.golden
index 52ca312..0934a11 100644
--- a/bind/testdata/structs.java.c.golden
+++ b/bind/testdata/structs.java.c.golden
@@ -16,6 +16,8 @@
 jmethodID proxy_class_structs_S_cons;
 jclass proxy_class_structs_S2;
 jmethodID proxy_class_structs_S2_cons;
+jclass proxy_class_structs_Structs;
+jmethodID proxy_class_structs_Structs_cons;
 
 JNIEXPORT void JNICALL
 Java_structs_Structs__1init(JNIEnv *env, jclass _unused) {
@@ -26,6 +28,9 @@
     clazz = (*env)->FindClass(env, "structs/S2");
     proxy_class_structs_S2 = (*env)->NewGlobalRef(env, clazz);
     proxy_class_structs_S2_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
+    clazz = (*env)->FindClass(env, "structs/Structs_");
+    proxy_class_structs_Structs = (*env)->NewGlobalRef(env, clazz);
+    proxy_class_structs_Structs_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
     clazz = (*env)->FindClass(env, "structs/Structs$proxyI");
     proxy_class_structs_I = (*env)->NewGlobalRef(env, clazz);
     proxy_class_structs_I_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
@@ -126,6 +131,18 @@
     return _r0;
 }
 
+JNIEXPORT jobject JNICALL
+Java_structs_Structs_1__1_1New(JNIEnv *env, jclass clazz) {
+    int32_t refnum = new_structs_Structs();
+    return go_seq_from_refnum(env, refnum, NULL, NULL);
+}
+
+JNIEXPORT void JNICALL
+Java_structs_Structs_1_m(JNIEnv* env, jobject __this__) {
+    int32_t o = go_seq_to_refnum_go(env, __this__);
+    proxystructs_Structs_M(o);
+}
+
 JNIEXPORT void JNICALL
 Java_structs_Structs_00024proxyI_m(JNIEnv* env, jobject __this__) {
     int32_t o = go_seq_to_refnum_go(env, __this__);
diff --git a/bind/testdata/structs.java.golden b/bind/testdata/structs.java.golden
index 9f5009e..e1aed3f 100644
--- a/bind/testdata/structs.java.golden
+++ b/bind/testdata/structs.java.golden
@@ -106,6 +106,51 @@
     }
 }
 
+// Java class structs.Structs_ is a proxy for talking to a Go program.
+//   gobind -lang=java structs
+//
+// File is generated by gobind. Do not edit.
+package structs;
+
+import go.Seq;
+
+public final class Structs_ implements Seq.Proxy, I {
+    static { Structs.touch(); }
+    
+    private final Seq.Ref ref;
+    
+    @Override public final int incRefnum() {
+          int refnum = ref.refnum;
+          Seq.incGoRef(refnum);
+          return refnum;
+    }
+    
+    Structs_(Seq.Ref ref) { this.ref = ref; }
+    
+    public Structs_() { this.ref = __New(); }
+    
+    private static native Seq.Ref __New();
+    
+    public native void m();
+    @Override public boolean equals(Object o) {
+        if (o == null || !(o instanceof Structs_)) {
+            return false;
+        }
+        Structs_ that = (Structs_)o;
+        return true;
+    }
+    
+    @Override public int hashCode() {
+        return java.util.Arrays.hashCode(new Object[] {});
+    }
+    
+    @Override public String toString() {
+        StringBuilder b = new StringBuilder();
+        b.append("Structs_").append("{");
+        return b.append("}").toString();
+    }
+}
+
 // Java class structs.I is a proxy for talking to a Go program.
 //   gobind -lang=java structs
 //
diff --git a/bind/testdata/structs.java.h.golden b/bind/testdata/structs.java.h.golden
index b80a847..4c84d34 100644
--- a/bind/testdata/structs.java.h.golden
+++ b/bind/testdata/structs.java.h.golden
@@ -17,4 +17,6 @@
 extern jmethodID proxy_class_structs_S_cons;
 extern jclass proxy_class_structs_S2;
 extern jmethodID proxy_class_structs_S2_cons;
+extern jclass proxy_class_structs_Structs;
+extern jmethodID proxy_class_structs_Structs_cons;
 #endif
diff --git a/bind/testdata/structs.objc.h.golden b/bind/testdata/structs.objc.h.golden
index 0ba8eab..3522f1e 100644
--- a/bind/testdata/structs.objc.h.golden
+++ b/bind/testdata/structs.objc.h.golden
@@ -12,6 +12,7 @@
 
 @class StructsS;
 @class StructsS2;
+@class StructsStructs;
 @protocol StructsI;
 @class StructsI;
 
@@ -43,6 +44,18 @@
 - (NSString*)string;
 @end
 
+/**
+ * Structs is a struct with the same name as its package.
+ */
+@interface StructsStructs : NSObject <goSeqRefInterface, StructsI> {
+}
+@property(strong, readonly) id _ref;
+
+- (instancetype)initWithRef:(id)ref;
+- (instancetype)init;
+- (void)m;
+@end
+
 FOUNDATION_EXPORT StructsS* StructsIdentity(StructsS* s);
 
 FOUNDATION_EXPORT StructsS* StructsIdentityWithError(StructsS* s, NSError** error);
diff --git a/bind/testdata/structs.objc.m.golden b/bind/testdata/structs.objc.m.golden
index 3d28302..87b1da8 100644
--- a/bind/testdata/structs.objc.m.golden
+++ b/bind/testdata/structs.objc.m.golden
@@ -123,6 +123,32 @@
 @end
 
 
+
+@implementation StructsStructs {
+}
+
+- (instancetype)initWithRef:(id)ref {
+	self = [super init];
+	if (self) { __ref = ref; }
+	return self;
+}
+
+- (instancetype)init {
+	self = [super init];
+	if (self) {
+		__ref = go_seq_from_refnum(new_structs_Structs());
+	}
+	return self;
+}
+
+- (void)m {
+	int32_t refnum = go_seq_go_to_refnum(self._ref);
+	proxystructs_Structs_M(refnum);
+}
+
+@end
+
+
 @implementation StructsI {
 }
 
diff --git a/bind/testpkg/secondpkg/secondpkg.go b/bind/testpkg/secondpkg/secondpkg.go
index 94f3e31..b7e7cd5 100644
--- a/bind/testpkg/secondpkg/secondpkg.go
+++ b/bind/testpkg/secondpkg/secondpkg.go
@@ -31,3 +31,14 @@
 func Hello() string {
 	return HelloString
 }
+
+type Secondpkg struct {
+	V string
+}
+
+func (_ *Secondpkg) M() {
+}
+
+func NewSecondpkg() *Secondpkg {
+	return new(Secondpkg)
+}
diff --git a/bind/testpkg/testpkg.go b/bind/testpkg/testpkg.go
index f0cda07..8ebbcd3 100644
--- a/bind/testpkg/testpkg.go
+++ b/bind/testpkg/testpkg.go
@@ -606,3 +606,8 @@
 		panic(fmt.Errorf("got %v, expected EPIPE", err))
 	}
 }
+
+// Testpkg is an empty interface with the same name as its package.
+type Testpkg interface{}
+
+func ClashingParameterFromOtherPackage(_ *secondpkg.Secondpkg) {}
