diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc
index df9aae7..2169afb 100644
--- a/test/cpp/end2end/end2end_test.cc
+++ b/test/cpp/end2end/end2end_test.cc
@@ -191,14 +191,14 @@
 
 class TestScenario {
  public:
-  TestScenario(bool proxy, const grpc::string& creds_type)
-      : use_proxy(proxy), credentials_type(creds_type) {}
+  TestScenario(bool proxy, TestCredentialsType type)
+      : use_proxy(proxy), credentials_type(type) {}
   void Log() const {
     gpr_log(GPR_INFO, "Scenario: proxy %d, credentials %s", use_proxy,
-            credentials_type.c_str());
+            TestCredentialsTypeToString(credentials_type).c_str());
   }
   bool use_proxy;
-  const grpc::string credentials_type;
+  TestCredentialsType credentials_type;
 };
 
 class End2endTest : public ::testing::TestWithParam<TestScenario> {
@@ -223,7 +223,7 @@
     // Setup server
     ServerBuilder builder;
     auto server_creds = GetServerCredentials(GetParam().credentials_type);
-    if (GetParam().credentials_type != kInsecureCredentialsType) {
+    if (GetParam().credentials_type != INSECURE_CREDENTIALS) {
       server_creds->SetAuthMetadataProcessor(processor);
     }
     builder.AddListeningPort(server_address_.str(), server_creds);
@@ -933,7 +933,7 @@
 
 // Takes 10s.
 TEST_P(End2endTest, ChannelStateTimeout) {
-  if (GetParam().credentials_type != kInsecureCredentialsType) {
+  if (GetParam().credentials_type != INSECURE_CREDENTIALS) {
     return;
   }
   int port = grpc_pick_unused_port_or_die();
@@ -1142,7 +1142,7 @@
  protected:
   SecureEnd2endTest() {
     GPR_ASSERT(!GetParam().use_proxy);
-    GPR_ASSERT(GetParam().credentials_type != kInsecureCredentialsType);
+    GPR_ASSERT(GetParam().credentials_type != INSECURE_CREDENTIALS);
   }
 };
 
@@ -1365,25 +1365,43 @@
   EXPECT_EQ("*.test.youtube.com", ToString(auth_ctx->GetPeerIdentity()[2]));
 }
 
-INSTANTIATE_TEST_CASE_P(
-    End2end, End2endTest,
-    ::testing::Values(TestScenario(false, kInsecureCredentialsType),
-                      TestScenario(false, kTlsCredentialsType)));
+std::vector<TestScenario> CreateTestScenarios(bool use_proxy,
+                                              bool test_insecure,
+                                              bool test_secure) {
+  std::vector<TestScenario> scenarios;
+  for (int i = INSECURE_CREDENTIALS; i < MAX_CREDENTIALS_TYPE; i++) {
+    if (i == INSECURE_CREDENTIALS && !test_insecure) {
+      continue;
+    }
+    if (i != INSECURE_CREDENTIALS && !test_secure) {
+      continue;
+    }
+    if (use_proxy) {
+      scenarios.push_back(
+          TestScenario(true, static_cast<TestCredentialsType>(i)));
+    }
+    scenarios.push_back(
+        TestScenario(false, static_cast<TestCredentialsType>(i)));
+  }
+  GPR_ASSERT(!scenarios.empty());
+  return scenarios;
+}
 
-INSTANTIATE_TEST_CASE_P(
-    End2endServerTryCancel, End2endServerTryCancelTest,
-    ::testing::Values(TestScenario(false, kInsecureCredentialsType)));
+INSTANTIATE_TEST_CASE_P(End2end, End2endTest,
+                        ::testing::ValuesIn(CreateTestScenarios(false, true,
+                                                                true)));
 
-INSTANTIATE_TEST_CASE_P(
-    ProxyEnd2end, ProxyEnd2endTest,
-    ::testing::Values(TestScenario(false, kInsecureCredentialsType),
-                      TestScenario(false, kTlsCredentialsType),
-                      TestScenario(true, kInsecureCredentialsType),
-                      TestScenario(true, kTlsCredentialsType)));
+INSTANTIATE_TEST_CASE_P(End2endServerTryCancel, End2endServerTryCancelTest,
+                        ::testing::ValuesIn(CreateTestScenarios(false, true,
+                                                                false)));
+
+INSTANTIATE_TEST_CASE_P(ProxyEnd2end, ProxyEnd2endTest,
+                        ::testing::ValuesIn(CreateTestScenarios(true, true,
+                                                                true)));
 
 INSTANTIATE_TEST_CASE_P(SecureEnd2end, SecureEnd2endTest,
-                        ::testing::Values(TestScenario(false,
-                                                       kTlsCredentialsType)));
+                        ::testing::ValuesIn(CreateTestScenarios(false, false,
+                                                                true)));
 
 }  // namespace
 }  // namespace testing
diff --git a/test/cpp/util/test_credentials_provider.cc b/test/cpp/util/test_credentials_provider.cc
index f8380cd..9746ca6 100644
--- a/test/cpp/util/test_credentials_provider.cc
+++ b/test/cpp/util/test_credentials_provider.cc
@@ -40,24 +40,24 @@
 namespace testing {
 
 std::shared_ptr<ChannelCredentials> GetChannelCredentials(
-    const grpc::string& type, ChannelArguments* args) {
-  if (type == kInsecureCredentialsType) {
+    TestCredentialsType type, ChannelArguments* args) {
+  if (type == INSECURE_CREDENTIALS) {
     return InsecureChannelCredentials();
-  } else if (type == kTlsCredentialsType) {
+  } else if (type == TLS_CREDENTIALS) {
     SslCredentialsOptions ssl_opts = {test_root_cert, "", ""};
     args->SetSslTargetNameOverride("foo.test.google.fr");
     return SslCredentials(ssl_opts);
   } else {
-    gpr_log(GPR_ERROR, "Unsupported credentials type %s.", type.c_str());
+    gpr_log(GPR_ERROR, "Unsupported credentials type %d.", type);
   }
   return nullptr;
 }
 
 std::shared_ptr<ServerCredentials> GetServerCredentials(
-    const grpc::string& type) {
-  if (type == kInsecureCredentialsType) {
+    TestCredentialsType type) {
+  if (type == INSECURE_CREDENTIALS) {
     return InsecureServerCredentials();
-  } else if (type == kTlsCredentialsType) {
+  } else if (type == TLS_CREDENTIALS) {
     SslServerCredentialsOptions::PemKeyCertPair pkcp = {test_server1_key,
                                                         test_server1_cert};
     SslServerCredentialsOptions ssl_opts;
@@ -65,10 +65,22 @@
     ssl_opts.pem_key_cert_pairs.push_back(pkcp);
     return SslServerCredentials(ssl_opts);
   } else {
-    gpr_log(GPR_ERROR, "Unsupported credentials type %s.", type.c_str());
+    gpr_log(GPR_ERROR, "Unsupported credentials type %d.", type);
   }
   return nullptr;
 }
 
+grpc::string TestCredentialsTypeToString(TestCredentialsType type) {
+  switch (type) {
+    case INSECURE_CREDENTIALS:
+      return "INSECURE_CREDENTIALS";
+    case TLS_CREDENTIALS:
+      return "TLS_CREDENTIALS";
+    default:
+      break;
+  }
+  return "UNKNOWN";
+}
+
 }  // namespace testing
 }  // namespace grpc
diff --git a/test/cpp/util/test_credentials_provider.h b/test/cpp/util/test_credentials_provider.h
index 4f25e3b..005254a 100644
--- a/test/cpp/util/test_credentials_provider.h
+++ b/test/cpp/util/test_credentials_provider.h
@@ -43,17 +43,22 @@
 namespace grpc {
 namespace testing {
 
-const char kInsecureCredentialsType[] = "INSECURE_CREDENTIALS";
-const char kTlsCredentialsType[] = "TLS_CREDENTIALS";
+enum TestCredentialsType {
+  INSECURE_CREDENTIALS = 0,
+  TLS_CREDENTIALS,
+  MAX_CREDENTIALS_TYPE
+};
 
 // Provide channel credentials according to the given type. Alter the channel
 // arguments if needed.
 std::shared_ptr<ChannelCredentials> GetChannelCredentials(
-    const grpc::string& type, ChannelArguments* args);
+    TestCredentialsType type, ChannelArguments* args);
 
 // Provide server credentials according to the given type.
 std::shared_ptr<ServerCredentials> GetServerCredentials(
-    const grpc::string& type);
+    TestCredentialsType type);
+
+grpc::string TestCredentialsTypeToString(TestCredentialsType type);
 
 }  // namespace testing
 }  // namespace grpc
