diff --git a/cmd/mgmt/device/impl/acl_impl.go b/cmd/mgmt/device/impl/acl_impl.go
index 7012e0f..8cd5dee 100644
--- a/cmd/mgmt/device/impl/acl_impl.go
+++ b/cmd/mgmt/device/impl/acl_impl.go
@@ -125,7 +125,7 @@
 			}
 		}
 		switch err := device.ApplicationClient(vanaName).SetPermissions(gctx, objAccessList, etag); {
-		case err != nil && !verror.Is(err, verror.ErrBadEtag.ID):
+		case err != nil && verror.ErrorID(err) != verror.ErrBadEtag.ID:
 			return fmt.Errorf("SetPermissions(%s) failed: %v", vanaName, err)
 		case err == nil:
 			return nil
diff --git a/cmd/mgmt/device/impl/impl_test.go b/cmd/mgmt/device/impl/impl_test.go
index 25de421..de48dae 100644
--- a/cmd/mgmt/device/impl/impl_test.go
+++ b/cmd/mgmt/device/impl/impl_test.go
@@ -331,7 +331,7 @@
 			t.Fatalf("Failed to marshal principal public key: %v", err)
 		}
 	}
-	if err := cmd.Execute([]string{"claim", deviceName, "grant", pairingToken, base64.URLEncoding.EncodeToString(deviceKeyWrong)}); !verror.Is(err, verror.ErrNotTrusted.ID) {
+	if err := cmd.Execute([]string{"claim", deviceName, "grant", pairingToken, base64.URLEncoding.EncodeToString(deviceKeyWrong)}); verror.ErrorID(err) != verror.ErrNotTrusted.ID {
 		t.Fatalf("wrongly failed to receive correct error on claim with incorrect device key:%v id:%v", err, verror.ErrorID(err))
 	}
 	stdout.Reset()
diff --git a/cmd/mgmt/device/impl/publish.go b/cmd/mgmt/device/impl/publish.go
index dbafdba..2a009a9 100644
--- a/cmd/mgmt/device/impl/publish.go
+++ b/cmd/mgmt/device/impl/publish.go
@@ -126,7 +126,7 @@
 	// the first match.  But presumably that's ok, since we're going to set
 	// the envelopes for all the profiles to the same envelope anyway below.
 	envelope, err := appClient.Match(gctx, profiles)
-	if verror.Is(err, appdimpl.ErrNotFound.ID) {
+	if verror.ErrorID(err) == appdimpl.ErrNotFound.ID {
 		// There was nothing published yet, create a new envelope.
 		envelope = application.Envelope{Title: binaryName}
 	} else if err != nil {
diff --git a/cmd/mgmt/device/impl/updateall.go b/cmd/mgmt/device/impl/updateall.go
index a833157..beb83cf 100644
--- a/cmd/mgmt/device/impl/updateall.go
+++ b/cmd/mgmt/device/impl/updateall.go
@@ -106,7 +106,7 @@
 				}
 			}
 		}()
-	case verror.Is(err, deviceimpl.ErrInvalidOperation.ID):
+	case verror.ErrorID(err) == deviceimpl.ErrInvalidOperation.ID:
 		// App was likely not running.
 		//
 		// TODO(caprita): change returned error to distinguish no-op
@@ -118,7 +118,7 @@
 	switch err := device.ApplicationClient(von).Update(gctx); {
 	case err == nil:
 		return nil
-	case verror.Is(err, deviceimpl.ErrUpdateNoOp.ID):
+	case verror.ErrorID(err) == deviceimpl.ErrUpdateNoOp.ID:
 		// TODO(caprita): Ideally, we wouldn't even attempt a suspend /
 		// resume if there's no newer version of the application.
 		fmt.Fprintf(cmd.Stdout(), "Instance %q already up to date.\n", von)
@@ -142,7 +142,7 @@
 	switch err := device.ApplicationClient(von).Update(gctx); {
 	case err == nil:
 		fmt.Fprintf(cmd.Stdout(), "Successfully updated version for installation %q.\n", von)
-	case verror.Is(err, deviceimpl.ErrUpdateNoOp.ID):
+	case verror.ErrorID(err) == deviceimpl.ErrUpdateNoOp.ID:
 		fmt.Fprintf(cmd.Stdout(), "Installation %q already up to date.\n", von)
 		// NOTE: we still proceed to update the instances in this case,
 		// since it's possible that some instances are still running
diff --git a/lib/exec/config_test.go b/lib/exec/config_test.go
index 59b7c8c..6bad180 100644
--- a/lib/exec/config_test.go
+++ b/lib/exec/config_test.go
@@ -20,7 +20,7 @@
 }
 
 func checkAbsent(t *testing.T, c Config, k string) {
-	if v, err := c.Get(k); !verror.Is(err, verror.ErrNoExist.ID) {
+	if v, err := c.Get(k); verror.ErrorID(err) != verror.ErrNoExist.ID {
 		t.Errorf("Expected (\"\", %v) for key %q, got (%q, %v) instead", verror.ErrNoExist, k, v, err)
 	}
 }
diff --git a/profiles/internal/naming/namespace/all_test.go b/profiles/internal/naming/namespace/all_test.go
index d4d37f7..7ff78dc 100644
--- a/profiles/internal/naming/namespace/all_test.go
+++ b/profiles/internal/naming/namespace/all_test.go
@@ -327,7 +327,7 @@
 	// /mt2 is not an endpoint. Thus, the example below will fail.
 	mt3Server := mts[mt3MP].name
 	mt2a := "/mt2/a"
-	if err := ns.Mount(c, mt2a, mt3Server, ttl); verror.Is(err, naming.ErrNoSuchName.ID) {
+	if err := ns.Mount(c, mt2a, mt3Server, ttl); verror.ErrorID(err) == naming.ErrNoSuchName.ID {
 		boom(t, "Successfully mounted %s - expected an err %v, not %v", mt2a, naming.ErrNoSuchName, err)
 	}
 
@@ -570,7 +570,7 @@
 	for i := 0; i < 40; i++ {
 		cycle += "/c3/c4"
 	}
-	if _, err := ns.Resolve(c, "c1/"+cycle); !verror.Is(err, naming.ErrResolutionDepthExceeded.ID) {
+	if _, err := ns.Resolve(c, "c1/"+cycle); verror.ErrorID(err) != naming.ErrResolutionDepthExceeded.ID {
 		boom(t, "Failed to detect cycle")
 	}
 
@@ -664,7 +664,7 @@
 		for _, root := range []string{hproot, eproot} {
 			name := naming.JoinAddressName(root, "mt")
 			// Rooted name resolutions should fail authorization because of the "otherrot"
-			if e, err := resolve(name); !verror.Is(err, verror.ErrNotTrusted.ID) {
+			if e, err := resolve(name); verror.ErrorID(err) != verror.ErrNotTrusted.ID {
 				t.Errorf("resolve(%q) returned (%v, errorid=%v %v), wanted errorid=%v", name, e, verror.ErrorID(err), err, verror.ErrNotTrusted.ID)
 			}
 			// But not fail if the skip-authorization option is provided
@@ -673,7 +673,7 @@
 			}
 			// The namespace root from the context should be authorized as well.
 			ctx, ns, _ := v23.SetNewNamespace(clientCtx, naming.JoinAddressName(root, ""))
-			if e, err := ns.Resolve(ctx, "mt/server"); !verror.Is(err, verror.ErrNotTrusted.ID) {
+			if e, err := ns.Resolve(ctx, "mt/server"); verror.ErrorID(err) != verror.ErrNotTrusted.ID {
 				t.Errorf("resolve with root=%q returned (%v, errorid=%v %v), wanted errorid=%v", root, e, verror.ErrorID(err), err, verror.ErrNotTrusted.ID)
 			}
 			if _, err := ns.Resolve(ctx, "mt/server", options.SkipServerEndpointAuthorization{}); err != nil {
@@ -693,7 +693,7 @@
 
 	if e, err := resolve("mt/server", options.SkipServerEndpointAuthorization{}); err != nil {
 		t.Errorf("Resolve should succeed when skipping server authorization. Got (%v, %v)", e, err)
-	} else if e, err := resolve("mt/server"); !verror.Is(err, verror.ErrNotTrusted.ID) {
+	} else if e, err := resolve("mt/server"); verror.ErrorID(err) != verror.ErrNotTrusted.ID {
 		t.Errorf("Resolve should have failed with %q because an attacker has taken over the intermediate mounttable. Got (%+v, errorid=%q:%v)", verror.ErrNotTrusted.ID, e, verror.ErrorID(err), err)
 	}
 }
diff --git a/profiles/internal/naming/namespace/resolve.go b/profiles/internal/naming/namespace/resolve.go
index 59f5f2a..07e22d2 100644
--- a/profiles/internal/naming/namespace/resolve.go
+++ b/profiles/internal/naming/namespace/resolve.go
@@ -40,7 +40,7 @@
 		entry := new(naming.MountEntry)
 		if err := call.Finish(entry); err != nil {
 			// If any replica says the name doesn't exist, return that fact.
-			if verror.Is(err, naming.ErrNoSuchName.ID) || verror.Is(err, naming.ErrNoSuchNameRoot.ID) {
+			if verror.ErrorID(err) == naming.ErrNoSuchName.ID || verror.ErrorID(err) == naming.ErrNoSuchNameRoot.ID {
 				return nil, err
 			}
 			// Keep track of the final error and continue with next server.
@@ -97,7 +97,7 @@
 				vlog.VI(1).Infof("Resolve(%s) -> %v", name, curr)
 				return curr, nil
 			}
-			if verror.Is(err, naming.ErrNoSuchNameRoot.ID) {
+			if verror.ErrorID(err) == naming.ErrNoSuchNameRoot.ID {
 				err = verror.New(naming.ErrNoSuchName, ctx, name)
 			}
 			vlog.VI(1).Infof("Resolve(%s) -> (%s: %v)", err, name, curr)
@@ -132,11 +132,11 @@
 			return last, nil
 		}
 		if e, err = ns.resolveAgainstMountTable(ctx, client, e, callOpts...); err != nil {
-			if verror.Is(err, naming.ErrNoSuchNameRoot.ID) {
+			if verror.ErrorID(err) == naming.ErrNoSuchNameRoot.ID {
 				vlog.VI(1).Infof("ResolveToMountTable(%s) -> %v (NoSuchRoot: %v)", name, last, curr)
 				return last, nil
 			}
-			if verror.Is(err, naming.ErrNoSuchName.ID) {
+			if verror.ErrorID(err) == naming.ErrNoSuchName.ID {
 				vlog.VI(1).Infof("ResolveToMountTable(%s) -> %v (NoSuchName: %v)", name, curr, curr)
 				return curr, nil
 			}
diff --git a/profiles/internal/rpc/client.go b/profiles/internal/rpc/client.go
index 194d12a..3aab4f9 100644
--- a/profiles/internal/rpc/client.go
+++ b/profiles/internal/rpc/client.go
@@ -389,7 +389,7 @@
 		// We always return NoServers as the error so that the caller knows
 		// that's ok to retry the operation since the name may be registered
 		// in the near future.
-		if verror.Is(err, naming.ErrNoSuchName.ID) {
+		if verror.ErrorID(err) == naming.ErrNoSuchName.ID {
 			return nil, verror.RetryRefetch, verror.New(verror.ErrNoServers, ctx, name)
 		}
 		return nil, verror.NoRetry, verror.New(verror.ErrNoServers, ctx, name, err)
@@ -467,7 +467,7 @@
 		case <-timeoutChan:
 			vlog.VI(2).Infof("rpc: timeout on connection to server %v ", name)
 			_, _, err := c.failedTryCall(ctx, name, method, responses, ch)
-			if !verror.Is(err, verror.ErrTimeout.ID) {
+			if verror.ErrorID(err) != verror.ErrTimeout.ID {
 				return nil, verror.NoRetry, verror.New(verror.ErrTimeout, ctx, err)
 			}
 			return nil, verror.NoRetry, err
@@ -578,7 +578,7 @@
 	for _, r := range responses {
 		if r != nil && r.err != nil {
 			switch {
-			case verror.Is(r.err, verror.ErrNotTrusted.ID) || verror.Is(r.err, errAuthError.ID):
+			case verror.ErrorID(r.err) == verror.ErrNotTrusted.ID || verror.ErrorID(r.err) == errAuthError.ID:
 				untrusted = append(untrusted, "("+r.err.Error()+") ")
 			default:
 				noconn = append(noconn, "("+r.err.Error()+") ")
@@ -715,7 +715,7 @@
 		return verror.New(verror.ErrInternal, fc.ctx, err)
 	}
 	switch {
-	case verror.Is(err, verror.ErrBadProtocol.ID):
+	case verror.ErrorID(err) == verror.ErrBadProtocol.ID:
 		switch fc.ctx.Err() {
 		case context.DeadlineExceeded:
 			// TODO(cnicolaou,m3b): reintroduce 'append' when the new verror API is done.
@@ -726,7 +726,7 @@
 			//return verror.Append(verror.New(verror.ErrCanceled, fc.ctx), verr)
 			return verror.New(verror.ErrCanceled, fc.ctx, err.Error())
 		}
-	case verror.Is(err, verror.ErrTimeout.ID):
+	case verror.ErrorID(err) == verror.ErrTimeout.ID:
 		// Canceled trumps timeout.
 		if fc.ctx.Err() == context.Canceled {
 			// TODO(cnicolaou,m3b): reintroduce 'append' when the new verror API is done.
@@ -917,7 +917,7 @@
 	if fc.response.Error != nil {
 		// TODO(cnicolaou): remove verror.ErrNoAccess with verror version
 		// when rpc.Server is converted.
-		if verror.Is(fc.response.Error, verror.ErrNoAccess.ID) && fc.dc != nil {
+		if verror.ErrorID(fc.response.Error) == verror.ErrNoAccess.ID && fc.dc != nil {
 			// In case the error was caused by a bad discharge, we do not want to get stuck
 			// with retrying again and again with this discharge. As there is no direct way
 			// to detect it, we conservatively flush all discharges we used from the cache.
diff --git a/profiles/internal/rpc/full_test.go b/profiles/internal/rpc/full_test.go
index 05314cb..5d555d3 100644
--- a/profiles/internal/rpc/full_test.go
+++ b/profiles/internal/rpc/full_test.go
@@ -307,7 +307,7 @@
 
 	// Check that we can no longer serve after Stop.
 	err := server.AddName("name doesn't matter")
-	if err == nil || !verror.Is(err, verror.ErrBadState.ID) {
+	if err == nil || verror.ErrorID(err) != verror.ErrBadState.ID {
 		t.Errorf("either no error, or a wrong error was returned: %v", err)
 	}
 	vlog.VI(1).Info("server.Stop DONE")
@@ -375,7 +375,7 @@
 	if err == nil && id.ID == "" {
 		return true
 	}
-	return verror.Is(err, id.ID)
+	return verror.ErrorID(err) == id.ID
 }
 
 func runServer(t *testing.T, ctx *context.T, ns ns.Namespace, principal security.Principal, name string, obj interface{}, opts ...rpc.ServerOpt) stream.Manager {
@@ -642,7 +642,7 @@
 	}
 	defer client.Close()
 	ctx, _ = v23.SetPrincipal(ctx, pclient)
-	if _, err := client.StartCall(ctx, "mountpoint/server", "Closure", nil); !verror.Is(err, verror.ErrNotTrusted.ID) {
+	if _, err := client.StartCall(ctx, "mountpoint/server", "Closure", nil); verror.ErrorID(err) != verror.ErrNotTrusted.ID {
 		t.Errorf("Got error %v (errorid=%v), want errorid=%v", err, verror.ErrorID(err), verror.ErrNotTrusted.ID)
 	}
 	// But the RPC should succeed if the client explicitly
@@ -769,7 +769,7 @@
 		err = call.Finish(results...)
 		if got, want := err, test.finishErr; (got == nil) != (want == nil) {
 			t.Errorf(`%s call.Finish got error "%v", want "%v'`, name(test), got, want)
-		} else if want != nil && !verror.Is(got, verror.ErrorID(want)) {
+		} else if want != nil && verror.ErrorID(got) != verror.ErrorID(want) {
 			t.Errorf(`%s call.Finish got error "%v", want "%v"`, name(test), got, want)
 		}
 		checkResultPtrs(t, name(test), results, test.results)
@@ -1137,7 +1137,7 @@
 			t.Errorf(`%s call.Finish got error: "%v", wanted the RPC to succeed`, name, err)
 		} else if err == nil && !test.authorized {
 			t.Errorf("%s call.Finish succeeded, expected authorization failure", name)
-		} else if !test.authorized && !verror.Is(err, verror.ErrNoAccess.ID) {
+		} else if !test.authorized && verror.ErrorID(err) != verror.ErrNoAccess.ID {
 			t.Errorf("%s. call.Finish returned error %v(%v), wanted %v", name, verror.ErrorID(verror.Convert(verror.ErrNoAccess, nil, err)), err, verror.ErrNoAccess)
 		}
 	}
@@ -1506,7 +1506,7 @@
 
 	ctx, _ = v23.SetPrincipal(ctx, pclient)
 	_, err := b.client.StartCall(ctx, "incompatible/suffix", "Echo", []interface{}{"foo"}, options.NoRetry{})
-	if !verror.Is(err, verror.ErrNoServers.ID) {
+	if verror.ErrorID(err) != verror.ErrNoServers.ID {
 		t.Errorf("Expected error %s, found: %v", verror.ErrNoServers, err)
 	}
 
@@ -1654,7 +1654,7 @@
 	if call != nil {
 		t.Errorf("Expected nil interface got: %#v", call)
 	}
-	if !verror.Is(err, verror.ErrBadArg.ID) {
+	if verror.ErrorID(err) != verror.ErrBadArg.ID {
 		t.Errorf("Expected an BadArg error, got: %s", err.Error())
 	}
 }
@@ -1956,7 +1956,7 @@
 		t.Errorf("Expected call to succeed but got %v", err)
 	}
 	// ...but fail if they differ.
-	if _, err = client.StartCall(ctx, mountName, "Closure", nil, options.SkipServerEndpointAuthorization{}, options.ServerPublicKey{pother.PublicKey()}); !verror.Is(err, verror.ErrNotTrusted.ID) {
+	if _, err = client.StartCall(ctx, mountName, "Closure", nil, options.SkipServerEndpointAuthorization{}, options.ServerPublicKey{pother.PublicKey()}); verror.ErrorID(err) != verror.ErrNotTrusted.ID {
 		t.Errorf("got %v, want %v", verror.ErrorID(err), verror.ErrNotTrusted.ID)
 	}
 }
diff --git a/profiles/internal/rpc/server_test.go b/profiles/internal/rpc/server_test.go
index 403ce73..ce935c9 100644
--- a/profiles/internal/rpc/server_test.go
+++ b/profiles/internal/rpc/server_test.go
@@ -102,11 +102,11 @@
 	}
 	defer server.Stop()
 	_, err = server.Listen(rpc.ListenSpec{})
-	if !verror.Is(err, verror.ErrBadArg.ID) {
+	if verror.ErrorID(err) != verror.ErrBadArg.ID {
 		t.Fatalf("expected a BadArg error: got %v", err)
 	}
 	_, err = server.Listen(rpc.ListenSpec{Addrs: rpc.ListenAddrs{{"tcp", "*:0"}}})
-	if !verror.Is(err, verror.ErrBadArg.ID) {
+	if verror.ErrorID(err) != verror.ErrBadArg.ID {
 		t.Fatalf("expected a BadArg error: got %v", err)
 	}
 	_, err = server.Listen(rpc.ListenSpec{
@@ -114,7 +114,7 @@
 			{"tcp", "*:0"},
 			{"tcp", "127.0.0.1:0"},
 		}})
-	if verror.Is(err, verror.ErrBadArg.ID) {
+	if verror.ErrorID(err) == verror.ErrBadArg.ID {
 		t.Fatalf("expected a BadArg error: got %v", err)
 	}
 	status := server.Status()
@@ -122,7 +122,7 @@
 		t.Fatalf("got %s, want %s", got, want)
 	}
 	_, err = server.Listen(rpc.ListenSpec{Addrs: rpc.ListenAddrs{{"tcp", "*:0"}}})
-	if !verror.Is(err, verror.ErrBadArg.ID) {
+	if verror.ErrorID(err) != verror.ErrBadArg.ID {
 		t.Fatalf("expected a BadArg error: got %v", err)
 	}
 	status = server.Status()
@@ -237,7 +237,7 @@
 	defer shutdown()
 
 	expectBadState := func(err error) {
-		if !verror.Is(err, verror.ErrBadState.ID) {
+		if verror.ErrorID(err) != verror.ErrBadState.ID {
 			t.Fatalf("%s: unexpected error: %v", loc(1), err)
 		}
 	}
diff --git a/profiles/internal/rpc/test/client_test.go b/profiles/internal/rpc/test/client_test.go
index 4c831f4..fafec63 100644
--- a/profiles/internal/rpc/test/client_test.go
+++ b/profiles/internal/rpc/test/client_test.go
@@ -254,7 +254,7 @@
 	name := naming.JoinAddressName(naming.FormatEndpoint("tcp", "203.0.113.10:443"), "")
 	client := v23.GetClient(ctx)
 	_, err := client.StartCall(ctx, name, "echo", []interface{}{"args don't matter"})
-	if !verror.Is(err, verror.ErrTimeout.ID) {
+	if verror.ErrorID(err) != verror.ErrTimeout.ID {
 		t.Fatalf("wrong error: %s", err)
 	}
 }
@@ -296,7 +296,7 @@
 func testForVerror(t *testing.T, err error, verr verror.IDAction) {
 	_, file, line, _ := runtime.Caller(1)
 	loc := fmt.Sprintf("%s:%d", filepath.Base(file), line)
-	if !verror.Is(err, verr.ID) {
+	if verror.ErrorID(err) != verr.ID {
 		if _, ok := err.(verror.E); !ok {
 			t.Fatalf("%s: err %v not a verror", loc, err)
 		}
@@ -469,7 +469,7 @@
 	ctx, _ = context.WithTimeout(ctx, 300*time.Millisecond)
 	call, err := v23.GetClient(ctx).StartCall(ctx, name, "Source", []interface{}{want})
 	if err != nil {
-		if !verror.Is(err, verror.ErrTimeout.ID) {
+		if verror.ErrorID(err) != verror.ErrTimeout.ID {
 			t.Fatalf("verror should be a timeout not %s: stack %s",
 				err, verror.Stack(err))
 		}
diff --git a/profiles/internal/rpc/test/proxy_test.go b/profiles/internal/rpc/test/proxy_test.go
index 3a8c154..fb89398 100644
--- a/profiles/internal/rpc/test/proxy_test.go
+++ b/profiles/internal/rpc/test/proxy_test.go
@@ -350,7 +350,7 @@
 	verifyMountMissing(t, ctx, ns, name)
 
 	status = server.Status()
-	if len(status.Proxies) != 1 || status.Proxies[0].Proxy != spec.Proxy || !verror.Is(status.Proxies[0].Error, verror.ErrNoServers.ID) {
+	if len(status.Proxies) != 1 || status.Proxies[0].Proxy != spec.Proxy || verror.ErrorID(status.Proxies[0].Error) != verror.ErrNoServers.ID {
 		t.Fatalf("proxy status is incorrect: %v", status.Proxies)
 	}
 
diff --git a/profiles/internal/rpc/testutil_test.go b/profiles/internal/rpc/testutil_test.go
index bb43fdd..b48f6c6 100644
--- a/profiles/internal/rpc/testutil_test.go
+++ b/profiles/internal/rpc/testutil_test.go
@@ -48,7 +48,7 @@
 			if !ok {
 				t.Errorf("%s result %d got type %T, want %T", name, ix, g, w)
 			}
-			if !verror.Is(g, w.ID) {
+			if verror.ErrorID(g) != w.ID {
 				t.Errorf("%s result %d got %v, want %v", name, ix, g, w)
 			}
 		default:
diff --git a/profiles/internal/rt/ipc_test.go b/profiles/internal/rt/ipc_test.go
index e7e05e3..d100b76 100644
--- a/profiles/internal/rt/ipc_test.go
+++ b/profiles/internal/rt/ipc_test.go
@@ -342,7 +342,7 @@
 		return nil
 	}
 
-	if err := makeCall(); !verror.Is(err, verror.ErrNotTrusted.ID) {
+	if err := makeCall(); verror.ErrorID(err) != verror.ErrNotTrusted.ID {
 		t.Fatalf("got error %v, expected %v", err, verror.ErrNotTrusted.ID)
 	}
 	ds.mu.Lock()
@@ -368,7 +368,7 @@
 	if err := pserver.BlessingStore().SetDefault(rootServerInvalidTPCaveat); err != nil {
 		t.Fatal(err)
 	}
-	if call, err := client.StartCall(clientCtx, serverName, "EchoBlessings", nil); verror.Is(err, verror.ErrNoAccess.ID) {
+	if call, err := client.StartCall(clientCtx, serverName, "EchoBlessings", nil); verror.ErrorID(err) == verror.ErrNoAccess.ID {
 		remoteBlessings, _ := call.RemoteBlessings()
 		t.Errorf("client.StartCall passed unexpectedly with remote end authenticated as: %v", remoteBlessings)
 	}
diff --git a/security/blessingroots_test.go b/security/blessingroots_test.go
index 412a0f3..e7ff446 100644
--- a/security/blessingroots_test.go
+++ b/security/blessingroots_test.go
@@ -73,7 +73,7 @@
 			}
 		}
 		for _, b := range d.notRecognized {
-			if err, want := br.Recognized(d.root, b), security.ErrUnrecognizedRoot.ID; !verror.Is(err, want) {
+			if err, want := br.Recognized(d.root, b), security.ErrUnrecognizedRoot.ID; verror.ErrorID(err) != want {
 				return fmt.Errorf("Recognized(%v, %q): Got %v(errorid=%v), want errorid=%v", d.root, b, err, verror.ErrorID(err), want)
 			}
 		}
diff --git a/services/mgmt/application/impl/acl_test.go b/services/mgmt/application/impl/acl_test.go
index baa3506..bdcc0b8 100644
--- a/services/mgmt/application/impl/acl_test.go
+++ b/services/mgmt/application/impl/acl_test.go
@@ -112,7 +112,7 @@
 	}
 
 	// Envelope putting as other should fail.
-	if err := v1stub.Put(otherCtx, []string{"base"}, envelopeV1); !verror.Is(err, verror.ErrNoAccess.ID) {
+	if err := v1stub.Put(otherCtx, []string{"base"}, envelopeV1); verror.ErrorID(err) != verror.ErrNoAccess.ID {
 		t.Fatalf("Put() returned errorid=%v wanted errorid=%v [%v]", verror.ErrorID(err), verror.ErrNoAccess.ID, err)
 	}
 
@@ -122,7 +122,7 @@
 	}
 
 	acl, etag, err := repostub.GetPermissions(ctx)
-	if !verror.Is(err, impl.ErrNotFound.ID) {
+	if verror.ErrorID(err) != impl.ErrNotFound.ID {
 		t.Fatalf("GetPermissions should have failed with ErrNotFound but was: %v", err)
 	}
 	if got, want := etag, ""; got != want {
@@ -251,7 +251,7 @@
 	for _, path := range []string{"repo/search", "repo/search/v1", "repo/search/v2"} {
 		stub := repository.ApplicationClient(path)
 		acl, etag, err := stub.GetPermissions(ctx)
-		if !verror.Is(err, impl.ErrNotFound.ID) {
+		if verror.ErrorID(err) != impl.ErrNotFound.ID {
 			t.Fatalf("GetPermissions should have failed with ErrNotFound but was: %v", err)
 		}
 		if got, want := etag, ""; got != want {
diff --git a/services/mgmt/application/impl/dispatcher.go b/services/mgmt/application/impl/dispatcher.go
index 89c9d91..7f04de0 100644
--- a/services/mgmt/application/impl/dispatcher.go
+++ b/services/mgmt/application/impl/dispatcher.go
@@ -52,7 +52,7 @@
 func (store *applicationAccessListStore) TAMForPath(path string) (access.Permissions, bool, error) {
 	tam, _, err := getAccessList((*fs.Memstore)(store), path)
 
-	if verror.Is(err, ErrNotFound.ID) {
+	if verror.ErrorID(err) == ErrNotFound.ID {
 		return nil, true, nil
 	}
 	if err != nil {
diff --git a/services/mgmt/application/impl/impl_test.go b/services/mgmt/application/impl/impl_test.go
index e6da1ba..247acee 100644
--- a/services/mgmt/application/impl/impl_test.go
+++ b/services/mgmt/application/impl/impl_test.go
@@ -97,7 +97,7 @@
 	if err := stubV2.Put(ctx, []string{"base"}, envelopeV2); err != nil {
 		t.Fatalf("Put() failed: %v", err)
 	}
-	if err := stub.Put(ctx, []string{"base", "media"}, envelopeV1); err == nil || !verror.Is(err, impl.ErrInvalidSuffix.ID) {
+	if err := stub.Put(ctx, []string{"base", "media"}, envelopeV1); err == nil || verror.ErrorID(err) != impl.ErrInvalidSuffix.ID {
 		t.Fatalf("Unexpected error: expected %v, got %v", impl.ErrInvalidSuffix, err)
 	}
 
@@ -116,13 +116,13 @@
 	if !reflect.DeepEqual(envelopeV1, output) {
 		t.Fatalf("Unexpected output: expected %v, got %v", envelopeV1, output)
 	}
-	if _, err := stubV2.Match(ctx, []string{"media"}); err == nil || !verror.Is(err, impl.ErrNotFound.ID) {
+	if _, err := stubV2.Match(ctx, []string{"media"}); err == nil || verror.ErrorID(err) != impl.ErrNotFound.ID {
 		t.Fatalf("Unexpected error: expected %v, got %v", impl.ErrNotFound, err)
 	}
-	if _, err := stubV2.Match(ctx, []string{}); err == nil || !verror.Is(err, impl.ErrNotFound.ID) {
+	if _, err := stubV2.Match(ctx, []string{}); err == nil || verror.ErrorID(err) != impl.ErrNotFound.ID {
 		t.Fatalf("Unexpected error: expected %v, got %v", impl.ErrNotFound, err)
 	}
-	if _, err := stub.Match(ctx, []string{"media"}); err == nil || !verror.Is(err, impl.ErrInvalidSuffix.ID) {
+	if _, err := stub.Match(ctx, []string{"media"}); err == nil || verror.ErrorID(err) != impl.ErrInvalidSuffix.ID {
 		t.Fatalf("Unexpected error: expected %v, got %v", impl.ErrInvalidSuffix, err)
 	}
 
@@ -149,13 +149,13 @@
 	if output, err = stubV1.Match(ctx, []string{"media"}); err != nil {
 		t.Fatalf("Match() failed: %v", err)
 	}
-	if err := stubV1.Remove(ctx, "base"); err == nil || !verror.Is(err, impl.ErrNotFound.ID) {
+	if err := stubV1.Remove(ctx, "base"); err == nil || verror.ErrorID(err) != impl.ErrNotFound.ID {
 		t.Fatalf("Unexpected error: expected %v, got %v", impl.ErrNotFound, err)
 	}
 	if err := stub.Remove(ctx, "base"); err != nil {
 		t.Fatalf("Remove() failed: %v", err)
 	}
-	if err := stubV2.Remove(ctx, "media"); err == nil || !verror.Is(err, impl.ErrNotFound.ID) {
+	if err := stubV2.Remove(ctx, "media"); err == nil || verror.ErrorID(err) != impl.ErrNotFound.ID {
 		t.Fatalf("Unexpected error: expected %v, got %v", impl.ErrNotFound, err)
 	}
 	if err := stubV1.Remove(ctx, "media"); err != nil {
@@ -164,13 +164,13 @@
 
 	// Finally, use Match() to test that Remove really removed the
 	// application envelopes.
-	if _, err := stubV1.Match(ctx, []string{"base"}); err == nil || !verror.Is(err, impl.ErrNotFound.ID) {
+	if _, err := stubV1.Match(ctx, []string{"base"}); err == nil || verror.ErrorID(err) != impl.ErrNotFound.ID {
 		t.Fatalf("Unexpected error: expected %v, got %v", impl.ErrNotFound, err)
 	}
-	if _, err := stubV1.Match(ctx, []string{"media"}); err == nil || !verror.Is(err, impl.ErrNotFound.ID) {
+	if _, err := stubV1.Match(ctx, []string{"media"}); err == nil || verror.ErrorID(err) != impl.ErrNotFound.ID {
 		t.Fatalf("Unexpected error: expected %v, got %v", impl.ErrNotFound, err)
 	}
-	if _, err := stubV2.Match(ctx, []string{"base"}); err == nil || !verror.Is(err, impl.ErrNotFound.ID) {
+	if _, err := stubV2.Match(ctx, []string{"base"}); err == nil || verror.ErrorID(err) != impl.ErrNotFound.ID {
 		t.Fatalf("Unexpected error: expected %v, got %v", impl.ErrNotFound, err)
 	}
 
diff --git a/services/mgmt/application/impl/service.go b/services/mgmt/application/impl/service.go
index ac6545e..0ffb770 100644
--- a/services/mgmt/application/impl/service.go
+++ b/services/mgmt/application/impl/service.go
@@ -250,7 +250,7 @@
 func getAccessList(store *fs.Memstore, path string) (access.Permissions, string, error) {
 	entry, err := store.BindObject(path).Get(nil)
 
-	if verror.Is(err, fs.ErrNotInMemStore.ID) {
+	if verror.ErrorID(err) == fs.ErrNotInMemStore.ID {
 		// No AccessList exists
 		return nil, "", verror.New(ErrNotFound, nil)
 	} else if err != nil {
@@ -274,7 +274,7 @@
 // where path is expected to have already been cleaned by naming.Join.
 func setAccessList(store *fs.Memstore, path string, acl access.Permissions, etag string) error {
 	_, oetag, err := getAccessList(store, path)
-	if verror.Is(err, ErrNotFound.ID) {
+	if verror.ErrorID(err) == ErrNotFound.ID {
 		oetag = etag
 	} else if err != nil {
 		return err
diff --git a/services/mgmt/binary/impl/acl_test.go b/services/mgmt/binary/impl/acl_test.go
index c7f357f..4670f36 100644
--- a/services/mgmt/binary/impl/acl_test.go
+++ b/services/mgmt/binary/impl/acl_test.go
@@ -192,10 +192,10 @@
 	}
 
 	vlog.VI(2).Infof("Verify that in the beginning other can't access bini/private or bini/shared")
-	if _, _, err := b("bini/private").Stat(otherCtx); !verror.Is(err, verror.ErrNoAccess.ID) {
+	if _, _, err := b("bini/private").Stat(otherCtx); verror.ErrorID(err) != verror.ErrNoAccess.ID {
 		t.Fatalf("Stat() should have failed but didn't: %v", err)
 	}
-	if _, _, err := b("bini/shared").Stat(otherCtx); !verror.Is(err, verror.ErrNoAccess.ID) {
+	if _, _, err := b("bini/shared").Stat(otherCtx); verror.ErrorID(err) != verror.ErrNoAccess.ID {
 		t.Fatalf("Stat() should have failed but didn't: %v", err)
 	}
 
@@ -263,7 +263,7 @@
 	// root level. Self has to set one explicitly to enable sharing. This way, self
 	// can't accidentally expose the server without setting a root AccessList.
 	vlog.VI(2).Infof(" Verify that other still can't access bini/shared.")
-	if _, _, err := b("bini/shared").Stat(otherCtx); !verror.Is(err, verror.ErrNoAccess.ID) {
+	if _, _, err := b("bini/shared").Stat(otherCtx); verror.ErrorID(err) != verror.ErrNoAccess.ID {
 		t.Fatalf("Stat() should have failed but didn't: %v", err)
 	}
 
@@ -280,7 +280,7 @@
 	if _, _, err := b("bini/shared").Stat(otherCtx); err != nil {
 		t.Fatalf("Stat() shouldn't have failed: %v", err)
 	}
-	if _, _, err := b("bini/private").Stat(otherCtx); !verror.Is(err, verror.ErrNoAccess.ID) {
+	if _, _, err := b("bini/private").Stat(otherCtx); verror.ErrorID(err) != verror.ErrNoAccess.ID {
 		t.Fatalf("Stat() should have failed but didn't: %v", err)
 	}
 
@@ -380,7 +380,7 @@
 	}
 
 	vlog.VI(2).Infof("And now other can do nothing at affecting the root. Other should be penitent.")
-	if err := b("bini/nototherbinary").Create(otherCtx, 1, repository.MediaInfo{Type: "application/octet-stream"}); !verror.Is(err, verror.ErrNoAccess.ID) {
+	if err := b("bini/nototherbinary").Create(otherCtx, 1, repository.MediaInfo{Type: "application/octet-stream"}); verror.ErrorID(err) != verror.ErrNoAccess.ID {
 		t.Fatalf("Create() should have failed %v", err)
 	}
 
@@ -402,7 +402,7 @@
 		t.Fatalf("SetPermissions() failed: %v", err)
 	}
 	vlog.VI(2).Infof("And now other can't access shared either.")
-	if _, _, err := b("bini/shared").Stat(otherCtx); !verror.Is(err, verror.ErrNoAccess.ID) {
+	if _, _, err := b("bini/shared").Stat(otherCtx); verror.ErrorID(err) != verror.ErrNoAccess.ID {
 		t.Fatalf("Stat() should have failed but didn't: %v", err)
 	}
 	// TODO(rjkroege): Extend the test with a third principal and verify that
diff --git a/services/mgmt/binary/impl/impl_test.go b/services/mgmt/binary/impl/impl_test.go
index 836d5ae..4f308e4 100644
--- a/services/mgmt/binary/impl/impl_test.go
+++ b/services/mgmt/binary/impl/impl_test.go
@@ -252,7 +252,7 @@
 	}
 	if err := binary.Create(ctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err == nil {
 		t.Fatalf("Create() did not fail when it should have")
-	} else if want := verror.ErrExist.ID; !verror.Is(err, want) {
+	} else if want := verror.ErrExist.ID; verror.ErrorID(err) != want {
 		t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
 	}
 	if streamErr, err := invokeUpload(t, ctx, binary, data[0], 0); streamErr != nil || err != nil {
@@ -260,12 +260,12 @@
 	}
 	if _, err := invokeUpload(t, ctx, binary, data[0], 0); err == nil {
 		t.Fatalf("Upload() did not fail when it should have")
-	} else if want := verror.ErrExist.ID; !verror.Is(err, want) {
+	} else if want := verror.ErrExist.ID; verror.ErrorID(err) != want {
 		t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
 	}
 	if _, _, err := invokeDownload(t, ctx, binary, 1); err == nil {
 		t.Fatalf("Download() did not fail when it should have")
-	} else if want := verror.ErrNoExist.ID; !verror.Is(err, want) {
+	} else if want := verror.ErrNoExist.ID; verror.ErrorID(err) != want {
 		t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
 	}
 	if streamErr, err := invokeUpload(t, ctx, binary, data[1], 1); streamErr != nil || err != nil {
@@ -279,12 +279,12 @@
 	for _, part := range []int32{-1, length} {
 		if _, err := invokeUpload(t, ctx, binary, []byte("dummy"), part); err == nil {
 			t.Fatalf("Upload() did not fail when it should have")
-		} else if want := impl.ErrInvalidPart.ID; !verror.Is(err, want) {
+		} else if want := impl.ErrInvalidPart.ID; verror.ErrorID(err) != want {
 			t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
 		}
 		if _, _, err := invokeDownload(t, ctx, binary, part); err == nil {
 			t.Fatalf("Download() did not fail when it should have")
-		} else if want := impl.ErrInvalidPart.ID; !verror.Is(err, want) {
+		} else if want := impl.ErrInvalidPart.ID; verror.ErrorID(err) != want {
 			t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
 		}
 	}
@@ -293,7 +293,7 @@
 	}
 	if err := binary.Delete(ctx); err == nil {
 		t.Fatalf("Delete() did not fail when it should have")
-	} else if want := verror.ErrNoExist.ID; !verror.Is(err, want) {
+	} else if want := verror.ErrNoExist.ID; verror.ErrorID(err) != want {
 		t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
 	}
 }
diff --git a/services/mgmt/binary/impl/service.go b/services/mgmt/binary/impl/service.go
index 072c088..d7fa896 100644
--- a/services/mgmt/binary/impl/service.go
+++ b/services/mgmt/binary/impl/service.go
@@ -310,7 +310,7 @@
 	err := checksumExists(path)
 	if err == nil {
 		return verror.New(verror.ErrExist, call.Context(), path)
-	} else if !verror.Is(err, verror.ErrNoExist.ID) {
+	} else if verror.ErrorID(err) != verror.ErrNoExist.ID {
 		return err
 	}
 	// Use os.OpenFile() to resolve races.
diff --git a/services/mgmt/debug/dispatcher_test.go b/services/mgmt/debug/dispatcher_test.go
index eb39567..40e89f2 100644
--- a/services/mgmt/debug/dispatcher_test.go
+++ b/services/mgmt/debug/dispatcher_test.go
@@ -118,7 +118,7 @@
 	{
 		lf := logreader.LogFileClient(naming.JoinAddressName(endpoint, "debug/logs/nosuchfile.INFO"))
 		_, err = lf.Size(tracedContext(ctx))
-		if expected := verror.ErrNoExist.ID; !verror.Is(err, expected) {
+		if expected := verror.ErrNoExist.ID; verror.ErrorID(err) != expected {
 			t.Errorf("unexpected error value, got %v, want: %v", err, expected)
 		}
 	}
@@ -142,7 +142,7 @@
 	{
 		st := stats.StatsClient(naming.JoinAddressName(endpoint, "debug/stats/testing/nobodyhome"))
 		_, err = st.Value(tracedContext(ctx))
-		if expected := verror.ErrNoExist.ID; !verror.Is(err, expected) {
+		if expected := verror.ErrNoExist.ID; verror.ErrorID(err) != expected {
 			t.Errorf("unexpected error value, got %v, want: %v", err, expected)
 		}
 	}
diff --git a/services/mgmt/device/impl/app_service.go b/services/mgmt/device/impl/app_service.go
index f552a00..2d55533 100644
--- a/services/mgmt/device/impl/app_service.go
+++ b/services/mgmt/device/impl/app_service.go
@@ -1028,7 +1028,7 @@
 	if err != nil {
 		return err
 	}
-	if err := transitionInstance(instanceDir, device.InstanceStateSuspended, device.InstanceStateStopped); verror.Is(err, ErrOperationFailed.ID) || err == nil {
+	if err := transitionInstance(instanceDir, device.InstanceStateSuspended, device.InstanceStateStopped); verror.ErrorID(err) == ErrOperationFailed.ID || err == nil {
 		return err
 	}
 	if err := transitionInstance(instanceDir, device.InstanceStateStarted, device.InstanceStateStopping); err != nil {
diff --git a/services/mgmt/device/impl/debug_acls_test.go b/services/mgmt/device/impl/debug_acls_test.go
index fe45b47..40cd3d8 100644
--- a/services/mgmt/device/impl/debug_acls_test.go
+++ b/services/mgmt/device/impl/debug_acls_test.go
@@ -33,7 +33,7 @@
 }
 
 func testAccessFail(t *testing.T, expected verror.ID, ctx *context.T, who string, name ...string) {
-	if _, err := statsStub(name...).Value(ctx); !verror.Is(err, expected) {
+	if _, err := statsStub(name...).Value(ctx); verror.ErrorID(err) != expected {
 		t.Fatalf(testutil.FormatLogLine(2, "%s got error %v but expected %v", who, err, expected))
 	}
 }
diff --git a/services/mgmt/device/impl/impl_test.go b/services/mgmt/device/impl/impl_test.go
index 9994b97..32d6c9f 100644
--- a/services/mgmt/device/impl/impl_test.go
+++ b/services/mgmt/device/impl/impl_test.go
@@ -1682,7 +1682,7 @@
 	if _, err := libbinary.Upload(ctx, naming.Join(binaryVON, "testbinary"), up, mediaInfo); err != nil {
 		t.Fatalf("Upload(%v) failed:%v", binaryVON, err)
 	}
-	if _, err := appStub().Install(ctx, mockApplicationRepoName, device.Config{}, nil); !verror.Is(err, impl.ErrOperationFailed.ID) {
+	if _, err := appStub().Install(ctx, mockApplicationRepoName, device.Config{}, nil); verror.ErrorID(err) != impl.ErrOperationFailed.ID {
 		t.Fatalf("Failed to verify signature mismatch for binary:%v. Got errorid=%v[%v], want errorid=%v", binaryVON, verror.ErrorID(err), err, impl.ErrOperationFailed.ID)
 	}
 
@@ -1712,7 +1712,7 @@
 	if _, err = libbinary.UploadFromDir(ctx, pkgVON, tmpdir); err != nil {
 		t.Fatalf("libbinary.UploadFromDir failed: %v", err)
 	}
-	if _, err := appStub().Install(ctx, mockApplicationRepoName, device.Config{}, nil); !verror.Is(err, impl.ErrOperationFailed.ID) {
+	if _, err := appStub().Install(ctx, mockApplicationRepoName, device.Config{}, nil); verror.ErrorID(err) != impl.ErrOperationFailed.ID {
 		t.Fatalf("Failed to verify signature mismatch for package:%v", pkgVON)
 	}
 }
diff --git a/services/mgmt/device/impl/util_test.go b/services/mgmt/device/impl/util_test.go
index f6e067c..6eec044 100644
--- a/services/mgmt/device/impl/util_test.go
+++ b/services/mgmt/device/impl/util_test.go
@@ -61,7 +61,7 @@
 func resolveExpectNotFound(t *testing.T, ctx *context.T, name string) {
 	if me, err := v23.GetNamespace(ctx).Resolve(ctx, name); err == nil {
 		t.Fatalf(testutil.FormatLogLine(2, "Resolve(%v) succeeded with results %v when it was expected to fail", name, me.Names()))
-	} else if expectErr := naming.ErrNoSuchName.ID; !verror.Is(err, expectErr) {
+	} else if expectErr := naming.ErrNoSuchName.ID; verror.ErrorID(err) != expectErr {
 		t.Fatalf(testutil.FormatLogLine(2, "Resolve(%v) failed with error %v, expected error ID %v", name, err, expectErr))
 	}
 }
@@ -109,7 +109,7 @@
 	// AlreadyClaimed)
 	start := time.Now()
 	for {
-		if err := device.ClaimableClient(name).Claim(ctx, pairingToken, g, s); !verror.Is(err, impl.ErrDeviceAlreadyClaimed.ID) {
+		if err := device.ClaimableClient(name).Claim(ctx, pairingToken, g, s); verror.ErrorID(err) != impl.ErrDeviceAlreadyClaimed.ID {
 			return
 		}
 		vlog.VI(4).Infof("Claimable server at %q has not stopped yet", name)
@@ -125,13 +125,13 @@
 	g := &granter{p: v23.GetPrincipal(ctx), extension: extension}
 	s := options.SkipServerEndpointAuthorization{}
 	// Call the Claim RPC
-	if err := device.ClaimableClient(name).Claim(ctx, pairingToken, g, s); !verror.Is(err, errID) {
+	if err := device.ClaimableClient(name).Claim(ctx, pairingToken, g, s); verror.ErrorID(err) != errID {
 		t.Fatalf(testutil.FormatLogLine(2, "%q.Claim(%q) expected to fail with %v, got %v [%v]", name, pairingToken, errID, verror.ErrorID(err), err))
 	}
 }
 
 func updateDeviceExpectError(t *testing.T, ctx *context.T, name string, errID verror.ID) {
-	if err := deviceStub(name).Update(ctx); !verror.Is(err, errID) {
+	if err := deviceStub(name).Update(ctx); verror.ErrorID(err) != errID {
 		t.Fatalf(testutil.FormatLogLine(2, "%q.Update expected to fail with %v, got %v [%v]", name, errID, verror.ErrorID(err), err))
 	}
 }
@@ -143,7 +143,7 @@
 }
 
 func revertDeviceExpectError(t *testing.T, ctx *context.T, name string, errID verror.ID) {
-	if err := deviceStub(name).Revert(ctx); !verror.Is(err, errID) {
+	if err := deviceStub(name).Revert(ctx); verror.ErrorID(err) != errID {
 		t.Fatalf(testutil.FormatLogLine(2, "%q.Revert() expected to fail with %v, got %v [%v]", name, errID, verror.ErrorID(err), err))
 	}
 }
@@ -207,7 +207,7 @@
 }
 
 func installAppExpectError(t *testing.T, ctx *context.T, expectedError verror.ID, opt ...interface{}) {
-	if _, err := appStub().Install(ctx, mockApplicationRepoName, ocfg(opt), opkg(opt)); err == nil || !verror.Is(err, expectedError) {
+	if _, err := appStub().Install(ctx, mockApplicationRepoName, ocfg(opt), opkg(opt)); err == nil || verror.ErrorID(err) != expectedError {
 		t.Fatalf(testutil.FormatLogLine(2, "Install expected to fail with %v, got %v [%v]", expectedError, verror.ErrorID(err), err))
 	}
 }
@@ -268,7 +268,7 @@
 }
 
 func startAppExpectError(t *testing.T, ctx *context.T, appID string, expectedError verror.ID) {
-	if _, err := startAppImpl(t, ctx, appID, "forapp"); err == nil || !verror.Is(err, expectedError) {
+	if _, err := startAppImpl(t, ctx, appID, "forapp"); err == nil || verror.ErrorID(err) != expectedError {
 		t.Fatalf(testutil.FormatLogLine(2, "Start(%v) expected to fail with %v, got %v [%v]", appID, expectedError, verror.ErrorID(err), err))
 	}
 }
@@ -292,7 +292,7 @@
 }
 
 func resumeAppExpectError(t *testing.T, ctx *context.T, appID, instanceID string, expectedError verror.ID) {
-	if err := appStub(appID, instanceID).Resume(ctx); err == nil || !verror.Is(err, expectedError) {
+	if err := appStub(appID, instanceID).Resume(ctx); err == nil || verror.ErrorID(err) != expectedError {
 		t.Fatalf(testutil.FormatLogLine(2, "Resume(%v/%v) expected to fail with %v, got %v [%v]", appID, instanceID, expectedError, verror.ErrorID(err), err))
 	}
 }
@@ -304,7 +304,7 @@
 }
 
 func updateInstanceExpectError(t *testing.T, ctx *context.T, appID, instanceID string, expectedError verror.ID) {
-	if err := appStub(appID, instanceID).Update(ctx); err == nil || !verror.Is(err, expectedError) {
+	if err := appStub(appID, instanceID).Update(ctx); err == nil || verror.ErrorID(err) != expectedError {
 		t.Fatalf(testutil.FormatLogLine(2, "Update(%v/%v) expected to fail with %v, got %v [%v]", appID, instanceID, expectedError, verror.ErrorID(err), err))
 	}
 }
@@ -316,7 +316,7 @@
 }
 
 func updateAppExpectError(t *testing.T, ctx *context.T, appID string, expectedError verror.ID) {
-	if err := appStub(appID).Update(ctx); err == nil || !verror.Is(err, expectedError) {
+	if err := appStub(appID).Update(ctx); err == nil || verror.ErrorID(err) != expectedError {
 		t.Fatalf(testutil.FormatLogLine(2, "Update(%v) expected to fail with %v, got %v [%v]", appID, expectedError, verror.ErrorID(err), err))
 	}
 }
@@ -328,7 +328,7 @@
 }
 
 func revertAppExpectError(t *testing.T, ctx *context.T, appID string, expectedError verror.ID) {
-	if err := appStub(appID).Revert(ctx); err == nil || !verror.Is(err, expectedError) {
+	if err := appStub(appID).Revert(ctx); err == nil || verror.ErrorID(err) != expectedError {
 		t.Fatalf(testutil.FormatLogLine(2, "Revert(%v) expected to fail with %v, got %v [%v]", appID, expectedError, verror.ErrorID(err), err))
 	}
 }
diff --git a/services/mgmt/lib/fs/simplestore_test.go b/services/mgmt/lib/fs/simplestore_test.go
index 2d092b3..df723d3 100644
--- a/services/mgmt/lib/fs/simplestore_test.go
+++ b/services/mgmt/lib/fs/simplestore_test.go
@@ -251,17 +251,17 @@
 	}
 
 	// At which point, Get() on the transaction won't find anything.
-	if _, err := memstoreOriginal.BindObject(fs.TP("/test/a")).Get(nil); !verror.Is(err, fs.ErrNotInMemStore.ID) {
+	if _, err := memstoreOriginal.BindObject(fs.TP("/test/a")).Get(nil); verror.ErrorID(err) != fs.ErrNotInMemStore.ID {
 		t.Fatalf("Get() should have failed: got %v, expected %v", err, verror.New(fs.ErrNotInMemStore, nil, tname+"/test/a"))
 	}
 
 	// Attempting to Remove() it over again will fail.
-	if err := memstoreOriginal.BindObject(fs.TP("/test/a")).Remove(nil); !verror.Is(err, fs.ErrNotInMemStore.ID) {
+	if err := memstoreOriginal.BindObject(fs.TP("/test/a")).Remove(nil); verror.ErrorID(err) != fs.ErrNotInMemStore.ID {
 		t.Fatalf("Remove() should have failed: got %v, expected %v", err, verror.New(fs.ErrNotInMemStore, nil, tname+"/test/a"))
 	}
 
 	// Attempting to Remove() a non-existing path will fail.
-	if err := memstoreOriginal.BindObject(fs.TP("/foo")).Remove(nil); !verror.Is(err, fs.ErrNotInMemStore.ID) {
+	if err := memstoreOriginal.BindObject(fs.TP("/foo")).Remove(nil); verror.ErrorID(err) != fs.ErrNotInMemStore.ID {
 		t.Fatalf("Remove() should have failed: got %v, expected %v", err, verror.New(fs.ErrNotInMemStore, nil, tname+"/foo"))
 	}
 
@@ -286,7 +286,7 @@
 	}
 
 	// Validate that Get will fail on a non-existent path.
-	if _, err := memstoreOriginal.BindObject("/test/c").Get(nil); !verror.Is(err, fs.ErrNotInMemStore.ID) {
+	if _, err := memstoreOriginal.BindObject("/test/c").Get(nil); verror.ErrorID(err) != fs.ErrNotInMemStore.ID {
 		t.Fatalf("Get() should have failed: got %v, expected %v", err, verror.New(fs.ErrNotInMemStore, nil, tname+"/test/c"))
 	}
 
@@ -409,17 +409,17 @@
 
 	// Put outside ot a transaction should fail.
 	bindingTnameTestA := memstoreOriginal.BindObject(naming.Join("fooey", "/test/a"))
-	if _, err := bindingTnameTestA.Put(nil, envelope); !verror.Is(err, fs.ErrWithoutTransaction.ID) {
+	if _, err := bindingTnameTestA.Put(nil, envelope); verror.ErrorID(err) != fs.ErrWithoutTransaction.ID {
 		t.Fatalf("Put() failed: got %v, expected %v", err, verror.New(fs.ErrWithoutTransaction, nil, "Put()"))
 	}
 
 	// Remove outside of a transaction should fail
-	if err := bindingTnameTestA.Remove(nil); !verror.Is(err, fs.ErrWithoutTransaction.ID) {
+	if err := bindingTnameTestA.Remove(nil); verror.ErrorID(err) != fs.ErrWithoutTransaction.ID {
 		t.Fatalf("Put() failed: got %v, expected %v", err, verror.New(fs.ErrWithoutTransaction, nil, "Remove()"))
 	}
 
 	// Commit outside of a transaction should fail
-	if err := memstoreOriginal.BindTransaction(tname).Commit(nil); !verror.Is(err, fs.ErrDoubleCommit.ID) {
+	if err := memstoreOriginal.BindTransaction(tname).Commit(nil); verror.ErrorID(err) != fs.ErrDoubleCommit.ID {
 		t.Fatalf("Commit() failed: got %v, expected %v", err, verror.New(fs.ErrDoubleCommit, nil))
 	}
 
@@ -438,7 +438,7 @@
 	memstoreOriginal.Unlock()
 
 	// Remove should definitely fail on an abndonned transaction.
-	if err := bindingTnameTestB.Remove(nil); !verror.Is(err, fs.ErrWithoutTransaction.ID) {
+	if err := bindingTnameTestB.Remove(nil); verror.ErrorID(err) != fs.ErrWithoutTransaction.ID {
 		t.Fatalf("Remove() failed: got %v, expected %v", err, verror.New(fs.ErrWithoutTransaction, nil, "Remove()"))
 	}
 }
diff --git a/services/mgmt/logreader/impl/logfile_test.go b/services/mgmt/logreader/impl/logfile_test.go
index 7678d8c..94593e5 100644
--- a/services/mgmt/logreader/impl/logfile_test.go
+++ b/services/mgmt/logreader/impl/logfile_test.go
@@ -101,7 +101,7 @@
 	// Try to access a file that doesn't exist.
 	lf := logreader.LogFileClient(naming.JoinAddressName(endpoint, "doesntexist"))
 	_, err = lf.Size(ctx)
-	if expected := verror.ErrNoExist.ID; !verror.Is(err, expected) {
+	if expected := verror.ErrNoExist.ID; verror.ErrorID(err) != expected {
 		t.Errorf("unexpected error value, got %v, want: %v", err, expected)
 	}
 
@@ -147,7 +147,7 @@
 		t.Errorf("ReadLog failed: %v", err)
 	}
 	_, err = stream.Finish()
-	if !verror.Is(err, verror.ErrEndOfFile.ID) {
+	if verror.ErrorID(err) != verror.ErrEndOfFile.ID {
 		t.Errorf("unexpected error, got %#v, want EOF", err)
 	}
 }
diff --git a/services/security/groups/server/server_test.go b/services/security/groups/server/server_test.go
index c1de821..666a156 100644
--- a/services/security/groups/server/server_test.go
+++ b/services/security/groups/server/server_test.go
@@ -173,7 +173,7 @@
 
 	// Creating same group again should fail, since the group already exists.
 	g = groups.GroupClient(naming.JoinAddressName(serverName, "grpA"))
-	if err := g.Create(ctx, nil, nil); !verror.Is(err, verror.ErrExist.ID) {
+	if err := g.Create(ctx, nil, nil); verror.ErrorID(err) != verror.ErrExist.ID {
 		t.Fatal("Create should have failed")
 	}
 
@@ -211,7 +211,7 @@
 		t.Fatal("Create failed: ", err)
 	}
 	// Delete with bad etag should fail.
-	if err := g.Delete(ctx, "20"); !verror.Is(err, verror.ErrBadEtag.ID) {
+	if err := g.Delete(ctx, "20"); verror.ErrorID(err) != verror.ErrBadEtag.ID {
 		t.Fatal("Delete should have failed with etag error")
 	}
 	// Delete with correct etag should succeed.
@@ -220,7 +220,7 @@
 		t.Fatal("Delete failed: ", err)
 	}
 	// Check that the group was actually deleted.
-	if _, _, err := g.Get(ctx, groups.GetRequest{}, ""); !verror.Is(err, verror.ErrNoExistOrNoAccess.ID) {
+	if _, _, err := g.Get(ctx, groups.GetRequest{}, ""); verror.ErrorID(err) != verror.ErrNoExistOrNoAccess.ID {
 		t.Fatal("Group was not deleted")
 	}
 
@@ -234,7 +234,7 @@
 		t.Fatal("Delete failed: ", err)
 	}
 	// Check that the group was actually deleted.
-	if _, _, err := g.Get(ctx, groups.GetRequest{}, ""); !verror.Is(err, verror.ErrNoExistOrNoAccess.ID) {
+	if _, _, err := g.Get(ctx, groups.GetRequest{}, ""); verror.ErrorID(err) != verror.ErrNoExistOrNoAccess.ID {
 		t.Fatal("Group was not deleted")
 	}
 	// Check that we can recreate a group that was deleted.
@@ -251,7 +251,7 @@
 		t.Fatal("Create failed: ", err)
 	}
 	// Delete should fail (no access).
-	if err := g.Delete(ctx, ""); !verror.Is(err, verror.ErrNoExistOrNoAccess.ID) {
+	if err := g.Delete(ctx, ""); verror.ErrorID(err) != verror.ErrNoExistOrNoAccess.ID {
 		t.Fatal("Delete should have failed with access error")
 	}
 }
@@ -288,7 +288,7 @@
 
 	// SetPermissions with bad etag should fail.
 	aclBefore, etagBefore = getAccessListAndEtagOrDie()
-	if err := g.SetPermissions(ctx, myacl, "20"); !verror.Is(err, verror.ErrBadEtag.ID) {
+	if err := g.SetPermissions(ctx, myacl, "20"); verror.ErrorID(err) != verror.ErrBadEtag.ID {
 		t.Fatal("SetPermissions should have failed with etag error")
 	}
 	// Since SetPermissions failed, the AccessList and etag should not have changed.
@@ -347,10 +347,10 @@
 	if err := g.SetPermissions(ctx, access.Permissions{}, ""); err != nil {
 		t.Fatal("SetPermissions failed: ", err)
 	}
-	if _, _, err := g.GetPermissions(ctx); !verror.Is(err, verror.ErrNoExistOrNoAccess.ID) {
+	if _, _, err := g.GetPermissions(ctx); verror.ErrorID(err) != verror.ErrNoExistOrNoAccess.ID {
 		t.Fatal("GetPermissions should have failed with access error")
 	}
-	if err := g.SetPermissions(ctx, myacl, ""); !verror.Is(err, verror.ErrNoExistOrNoAccess.ID) {
+	if err := g.SetPermissions(ctx, myacl, ""); verror.ErrorID(err) != verror.ErrNoExistOrNoAccess.ID {
 		t.Fatal("SetPermissions should have failed with access error")
 	}
 }
@@ -374,7 +374,7 @@
 	var etagBefore, etagAfter string
 	etagBefore = getEtagOrDie(g, ctx, t)
 	// Add with bad etag should fail.
-	if err := g.Add(ctx, bpc("foo"), "20"); !verror.Is(err, verror.ErrBadEtag.ID) {
+	if err := g.Add(ctx, bpc("foo"), "20"); verror.ErrorID(err) != verror.ErrBadEtag.ID {
 		t.Fatal("Add should have failed with etag error")
 	}
 	// Etag should not have changed.
@@ -435,7 +435,7 @@
 		t.Fatal("Create failed: ", err)
 	}
 	// Add should fail (no access).
-	if err := g.Add(ctx, bpc("foo"), ""); !verror.Is(err, verror.ErrNoExistOrNoAccess.ID) {
+	if err := g.Add(ctx, bpc("foo"), ""); verror.ErrorID(err) != verror.ErrNoExistOrNoAccess.ID {
 		t.Fatal("Add should have failed with access error")
 	}
 }
@@ -459,7 +459,7 @@
 	var etagBefore, etagAfter string
 	etagBefore = getEtagOrDie(g, ctx, t)
 	// Remove with bad etag should fail.
-	if err := g.Remove(ctx, bpc("foo"), "20"); !verror.Is(err, verror.ErrBadEtag.ID) {
+	if err := g.Remove(ctx, bpc("foo"), "20"); verror.ErrorID(err) != verror.ErrBadEtag.ID {
 		t.Fatal("Remove should have failed with etag error")
 	}
 	// Etag should not have changed.
@@ -520,7 +520,7 @@
 		t.Fatal("Create failed: ", err)
 	}
 	// Remove should fail (no access).
-	if err := g.Remove(ctx, bpc("foo"), ""); !verror.Is(err, verror.ErrNoExistOrNoAccess.ID) {
+	if err := g.Remove(ctx, bpc("foo"), ""); verror.ErrorID(err) != verror.ErrNoExistOrNoAccess.ID {
 		t.Fatal("Remove should have failed with access error")
 	}
 }
diff --git a/services/wsprd/app/app_test.go b/services/wsprd/app/app_test.go
index 974d061..8c75b0a 100644
--- a/services/wsprd/app/app_test.go
+++ b/services/wsprd/app/app_test.go
@@ -450,11 +450,7 @@
 	var result *vdl.Value
 	err = call.Finish(&result)
 
-	// If err is nil and testCase.err is nil reflect.DeepEqual will return
-	// false because the types are different.  Because of this, we only use
-	// reflect.DeepEqual if one of the values is non-nil.  If both values
-	// are nil, then we consider them equal.
-	if (err != nil || testCase.err != nil) && !verror.Equal(err, testCase.err) {
+	if verror.ErrorID(err) != verror.ErrorID(testCase.err) {
 		t.Errorf("unexpected err: got %#v, expected %#v", err, testCase.err)
 	}
 
diff --git a/services/wsprd/app/messaging.go b/services/wsprd/app/messaging.go
index 5ea5a40..22a092e 100644
--- a/services/wsprd/app/messaging.go
+++ b/services/wsprd/app/messaging.go
@@ -179,7 +179,7 @@
 	if _, file, line, ok := runtime.Caller(3); ok {
 		logErr = fmt.Sprintf("%s:%d: %s", filepath.Base(file), line, logErr)
 	}
-	if verror.Is(verr, verror.ErrInternal.ID) {
+	if verror.ErrorID(verr) == verror.ErrInternal.ID {
 		logLevel = 2
 	}
 	vlog.VI(logLevel).Info(logErr)
diff --git a/services/wsprd/lib/testwriter/writer.go b/services/wsprd/lib/testwriter/writer.go
index 6aec6dc..65dabb9 100644
--- a/services/wsprd/lib/testwriter/writer.go
+++ b/services/wsprd/lib/testwriter/writer.go
@@ -105,7 +105,7 @@
 	if got, want := w.Stream, wantStream; !reflect.DeepEqual(got, want) {
 		return fmt.Errorf("streams don't match: got %#v, want %#v", got, want)
 	}
-	if got, want := w.err, wantErr; !verror.Equal(got, want) {
+	if got, want := w.err, wantErr; verror.ErrorID(got) != verror.ErrorID(want) {
 		return fmt.Errorf("unexpected error, got: %#v, expected: %#v", got, want)
 	}
 	return nil
diff --git a/services/wsprd/principal/util_test.go b/services/wsprd/principal/util_test.go
index 80bf068..7ee21ed 100644
--- a/services/wsprd/principal/util_test.go
+++ b/services/wsprd/principal/util_test.go
@@ -40,7 +40,7 @@
 	if got == nil {
 		return fmt.Errorf("Got nil error, wanted to match %q", want)
 	}
-	if !verror.Is(got, want) {
+	if verror.ErrorID(got) != want {
 		return fmt.Errorf("Got error %q, wanted to match %q", got, want)
 	}
 	return nil
diff --git a/services/wsprd/wspr/writer.go b/services/wsprd/wspr/writer.go
index 3fe0917..956c6bb 100644
--- a/services/wsprd/wspr/writer.go
+++ b/services/wsprd/wspr/writer.go
@@ -64,7 +64,7 @@
 	if _, file, line, ok := runtime.Caller(3); ok {
 		logErr = fmt.Sprintf("%s:%d: %s", filepath.Base(file), line, logErr)
 	}
-	if verror.Is(verr, verror.ErrInternal.ID) {
+	if verror.ErrorID(verr) == verror.ErrInternal.ID {
 		logLevel = 2
 	}
 	vlog.VI(logLevel).Info(logErr)
