diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn
index 2b450fb..b975fc1 100644
--- a/src/tint/BUILD.gn
+++ b/src/tint/BUILD.gn
@@ -201,8 +201,6 @@
 
 libtint_source_set("libtint_symbols_src") {
   sources = [
-    "number.cc",
-    "number.h",
     "program_id.cc",
     "program_id.h",
     "reflection.h",
@@ -812,6 +810,7 @@
     "builtin/diagnostic_severity.h",
     "builtin/extension.cc",
     "builtin/extension.h",
+    "builtin/fluent_types.h",
     "builtin/function.cc",
     "builtin/function.h",
     "builtin/interpolation.h",
@@ -819,6 +818,8 @@
     "builtin/interpolation_sampling.h",
     "builtin/interpolation_type.cc",
     "builtin/interpolation_type.h",
+    "builtin/number.cc",
+    "builtin/number.h",
     "builtin/texel_format.cc",
     "builtin/texel_format.h",
   ]
@@ -920,6 +921,7 @@
     "constant/value.h",
   ]
   deps = [
+    ":libtint_builtins_src",
     ":libtint_symbols_src",
     ":libtint_type_src",
     ":libtint_utils_src",
@@ -1604,6 +1606,7 @@
       "builtin/extension_test.cc",
       "builtin/interpolation_sampling_test.cc",
       "builtin/interpolation_type_test.cc",
+      "builtin/number_test.cc",
       "builtin/texel_format_test.cc",
     ]
     deps = [ ":libtint_builtins_src" ]
@@ -2256,6 +2259,7 @@
 
     deps = [
       ":libtint_ast_transform_src",
+      ":libtint_builtins_src",
       ":libtint_glsl_writer_src",
       ":libtint_symbols_src",
       ":libtint_transform_manager_src",
@@ -2266,7 +2270,6 @@
 
   tint_unittests_source_set("tint_unittests_symbols_src") {
     sources = [
-      "number_test.cc",
       "reflection_test.cc",
       "scope_stack_test.cc",
       "symbol_table_test.cc",
diff --git a/src/tint/CMakeLists.txt b/src/tint/CMakeLists.txt
index 6e6d760..3345626 100644
--- a/src/tint/CMakeLists.txt
+++ b/src/tint/CMakeLists.txt
@@ -58,14 +58,14 @@
 add_library(tint_diagnostic_utils
   debug.cc
   debug.h
-  source.h
-  source.cc
   diagnostic/diagnostic.cc
   diagnostic/diagnostic.h
   diagnostic/formatter.cc
   diagnostic/formatter.h
   diagnostic/printer.cc
   diagnostic/printer.h
+  source.cc
+  source.h
   utils/debugger.cc
   utils/debugger.h
   utils/unicode.cc
@@ -232,6 +232,9 @@
   ast/while_statement.h
   ast/workgroup_attribute.cc
   ast/workgroup_attribute.h
+  builtin/fluent_types.h
+  builtin/number.cc
+  builtin/number.h
   clone_context.cc
   clone_context.h
   constant/clone_context.h
@@ -255,8 +258,6 @@
   inspector/resource_binding.h
   inspector/scalar.cc
   inspector/scalar.h
-  number.cc
-  number.h
   program_builder.cc
   program_builder.h
   program_id.cc
@@ -955,6 +956,7 @@
     ast/variable_test.cc
     ast/while_statement_test.cc
     ast/workgroup_attribute_test.cc
+    builtin/number_test.cc
     clone_context_test.cc
     constant/composite_test.cc
     constant/manager_test.cc
@@ -965,7 +967,6 @@
     diagnostic/diagnostic_test.cc
     diagnostic/formatter_test.cc
     diagnostic/printer_test.cc
-    number_test.cc
     program_builder_test.cc
     program_test.cc
     reflection_test.cc
diff --git a/src/tint/ast/builtin_texture_helper_test.cc b/src/tint/ast/builtin_texture_helper_test.cc
index 3231081a..7f1e91a 100644
--- a/src/tint/ast/builtin_texture_helper_test.cc
+++ b/src/tint/ast/builtin_texture_helper_test.cc
@@ -20,7 +20,8 @@
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/texture_dimension.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::ast::test {
 namespace {
@@ -492,10 +493,10 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList(0_i,                      // component
-                                   kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f));  // coords
+                return b->ExprList(0_i,                            // component
+                                   kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f));  // coords
             },
             /* returns value */ true,
         },
@@ -512,11 +513,11 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList(0_u,                      // component
-                                   kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   b->vec2<i32>(3_i, 4_i));  // offset
+                return b->ExprList(0_u,                            // component
+                                   kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   b->Call<vec2<i32>>(3_i, 4_i));  // offset
             },
             /* returns value */ true,
         },
@@ -533,11 +534,11 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList(0_i,                     // component
-                                   kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   3_i);                    // array index
+                return b->ExprList(0_i,                           // component
+                                   kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   3_i);                          // array index
             },
             /* returns value */ true,
         },
@@ -555,12 +556,12 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList(0_u,                      // component
-                                   kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_u,                      // array_index
-                                   b->vec2<i32>(4_i, 5_i));  // offset
+                return b->ExprList(0_u,                            // component
+                                   kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_u,                            // array_index
+                                   b->Call<vec2<i32>>(4_i, 5_i));  // offset
             },
             /* returns value */ true,
         },
@@ -576,10 +577,10 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList(0_i,                           // component
-                                   kTextureName,                  // t
-                                   kSamplerName,                  // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f));  // coords
+                return b->ExprList(0_i,                                 // component
+                                   kTextureName,                        // t
+                                   kSamplerName,                        // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f));  // coords
             },
             /* returns value */ true,
         },
@@ -596,11 +597,11 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList(0_u,                          // component
-                                   kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_u);                         // array_index
+                return b->ExprList(0_u,                                // component
+                                   kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_u);                               // array_index
             },
             /* returns value */ true,
         },
@@ -615,9 +616,9 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f));  // coords
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f));  // coords
             },
             /* returns value */ true,
         },
@@ -633,10 +634,10 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   b->vec2<i32>(3_i, 4_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   b->Call<vec2<i32>>(3_i, 4_i));  // offset
             },
             /* returns value */ true,
         },
@@ -652,10 +653,10 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   3_u);                    // array_index
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   3_u);                          // array_index
             },
             /* returns value */ true,
         },
@@ -672,11 +673,11 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_i,                      // array_index
-                                   b->vec2<i32>(4_i, 5_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_i,                            // array_index
+                                   b->Call<vec2<i32>>(4_i, 5_i));  // offset
             },
             /* returns value */ true,
         },
@@ -691,9 +692,9 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                  // t
-                                   kSamplerName,                  // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f));  // coords
+                return b->ExprList(kTextureName,                        // t
+                                   kSamplerName,                        // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f));  // coords
             },
             /* returns value */ true,
         },
@@ -709,10 +710,10 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_u);                         // array_index
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_u);                               // array_index
             },
             /* returns value */ true,
         },
@@ -728,10 +729,10 @@
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   3_f);                    // depth_ref
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   3_f);                          // depth_ref
             },
             /* returns value */ true,
         },
@@ -748,11 +749,11 @@
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_f,                      // depth_ref
-                                   b->vec2<i32>(4_i, 5_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_f,                            // depth_ref
+                                   b->Call<vec2<i32>>(4_i, 5_i));  // offset
             },
             /* returns value */ true,
         },
@@ -769,11 +770,11 @@
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   3_i,                     // array_index
-                                   4_f);                    // depth_ref
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   3_i,                           // array_index
+                                   4_f);                          // depth_ref
             },
             /* returns value */ true,
         },
@@ -791,12 +792,12 @@
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_i,                      // array_index
-                                   4_f,                      // depth_ref
-                                   b->vec2<i32>(5_i, 6_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_i,                            // array_index
+                                   4_f,                            // depth_ref
+                                   b->Call<vec2<i32>>(5_i, 6_i));  // offset
             },
             /* returns value */ true,
         },
@@ -812,10 +813,10 @@
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_f);                         // depth_ref
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_f);                               // depth_ref
             },
             /* returns value */ true,
         },
@@ -832,11 +833,11 @@
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_u,                          // array_index
-                                   5_f);                         // depth_ref
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_u,                                // array_index
+                                   5_f);                               // depth_ref
             },
             /* returns value */ true,
         },
@@ -1044,9 +1045,9 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f));  // coords
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f));  // coords
             },
             /* returns value */ true,
         },
@@ -1062,10 +1063,10 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   b->vec2<i32>(3_i, 4_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   b->Call<vec2<i32>>(3_i, 4_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1081,10 +1082,10 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   3_i);                    // array_index
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   3_i);                          // array_index
             },
             /* returns value */ true,
         },
@@ -1101,11 +1102,11 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_u,                      // array_index
-                                   b->vec2<i32>(4_i, 5_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_u,                            // array_index
+                                   b->Call<vec2<i32>>(4_i, 5_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1120,9 +1121,9 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                  // t
-                                   kSamplerName,                  // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f));  // coords
+                return b->ExprList(kTextureName,                        // t
+                                   kSamplerName,                        // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f));  // coords
             },
             /* returns value */ true,
         },
@@ -1138,10 +1139,10 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                  // t
-                                   kSamplerName,                  // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),   // coords
-                                   b->vec3<i32>(4_i, 5_i, 6_i));  // offset
+                return b->ExprList(kTextureName,                        // t
+                                   kSamplerName,                        // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),   // coords
+                                   b->Call<vec3<i32>>(4_i, 5_i, 6_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1156,9 +1157,9 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                  // t
-                                   kSamplerName,                  // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f));  // coords
+                return b->ExprList(kTextureName,                        // t
+                                   kSamplerName,                        // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f));  // coords
             },
             /* returns value */ true,
         },
@@ -1174,10 +1175,10 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_i);                         // array_index
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_i);                               // array_index
             },
             /* returns value */ true,
         },
@@ -1192,9 +1193,9 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f));  // coords
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f));  // coords
             },
             /* returns value */ true,
         },
@@ -1210,10 +1211,10 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   b->vec2<i32>(3_i, 4_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   b->Call<vec2<i32>>(3_i, 4_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1229,10 +1230,10 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   3_i);                    // array_index
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   3_i);                          // array_index
             },
             /* returns value */ true,
         },
@@ -1249,11 +1250,11 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_i,                      // array_index
-                                   b->vec2<i32>(4_i, 5_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_i,                            // array_index
+                                   b->Call<vec2<i32>>(4_i, 5_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1268,9 +1269,9 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                  // t
-                                   kSamplerName,                  // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f));  // coords
+                return b->ExprList(kTextureName,                        // t
+                                   kSamplerName,                        // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f));  // coords
             },
             /* returns value */ true,
         },
@@ -1286,10 +1287,10 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_u);                         // array_index
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_u);                               // array_index
             },
             /* returns value */ true,
         },
@@ -1305,10 +1306,10 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   3_f);                    // bias
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   3_f);                          // bias
             },
             /* returns value */ true,
         },
@@ -1325,11 +1326,11 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_f,                      // bias
-                                   b->vec2<i32>(4_i, 5_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_f,                            // bias
+                                   b->Call<vec2<i32>>(4_i, 5_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1346,11 +1347,11 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   4_u,                     // array_index
-                                   3_f);                    // bias
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   4_u,                           // array_index
+                                   3_f);                          // bias
             },
             /* returns value */ true,
         },
@@ -1368,12 +1369,12 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_i,                      // array_index
-                                   4_f,                      // bias
-                                   b->vec2<i32>(5_i, 6_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_i,                            // array_index
+                                   4_f,                            // bias
+                                   b->Call<vec2<i32>>(5_i, 6_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1389,10 +1390,10 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_f);                         // bias
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_f);                               // bias
             },
             /* returns value */ true,
         },
@@ -1409,11 +1410,11 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                  // t
-                                   kSamplerName,                  // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),   // coords
-                                   4_f,                           // bias
-                                   b->vec3<i32>(5_i, 6_i, 7_i));  // offset
+                return b->ExprList(kTextureName,                        // t
+                                   kSamplerName,                        // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),   // coords
+                                   4_f,                                 // bias
+                                   b->Call<vec3<i32>>(5_i, 6_i, 7_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1429,10 +1430,10 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_f);                         // bias
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_f);                               // bias
             },
             /* returns value */ true,
         },
@@ -1449,11 +1450,11 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   3_i,                          // array_index
-                                   4_f);                         // bias
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   3_i,                                // array_index
+                                   4_f);                               // bias
             },
             /* returns value */ true,
         },
@@ -1469,10 +1470,10 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   3_f);                    // level
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   3_f);                          // level
             },
             /* returns value */ true,
         },
@@ -1489,11 +1490,11 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_f,                      // level
-                                   b->vec2<i32>(4_i, 5_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_f,                            // level
+                                   b->Call<vec2<i32>>(4_i, 5_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1510,11 +1511,11 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   3_i,                     // array_index
-                                   4_f);                    // level
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   3_i,                           // array_index
+                                   4_f);                          // level
             },
             /* returns value */ true,
         },
@@ -1532,12 +1533,12 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_i,                      // array_index
-                                   4_f,                      // level
-                                   b->vec2<i32>(5_i, 6_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_i,                            // array_index
+                                   4_f,                            // level
+                                   b->Call<vec2<i32>>(5_i, 6_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1553,10 +1554,10 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_f);                         // level
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_f);                               // level
             },
             /* returns value */ true,
         },
@@ -1573,11 +1574,11 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                  // t
-                                   kSamplerName,                  // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),   // coords
-                                   4_f,                           // level
-                                   b->vec3<i32>(5_i, 6_i, 7_i));  // offset
+                return b->ExprList(kTextureName,                        // t
+                                   kSamplerName,                        // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),   // coords
+                                   4_f,                                 // level
+                                   b->Call<vec3<i32>>(5_i, 6_i, 7_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1593,10 +1594,10 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_f);                         // level
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_f);                               // level
             },
             /* returns value */ true,
         },
@@ -1613,11 +1614,11 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_i,                          // array_index
-                                   5_f);                         // level
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_i,                                // array_index
+                                   5_f);                               // level
             },
             /* returns value */ true,
         },
@@ -1633,10 +1634,10 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   3_u);                    // level
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   3_u);                          // level
             },
             /* returns value */ true,
         },
@@ -1653,11 +1654,11 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_i,                      // level
-                                   b->vec2<i32>(4_i, 5_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_i,                            // level
+                                   b->Call<vec2<i32>>(4_i, 5_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1674,11 +1675,11 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   3_u,                     // array_index
-                                   4_u);                    // level
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   3_u,                           // array_index
+                                   4_u);                          // level
             },
             /* returns value */ true,
         },
@@ -1696,12 +1697,12 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_u,                      // array_index
-                                   4_u,                      // level
-                                   b->vec2<i32>(5_i, 6_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_u,                            // array_index
+                                   4_u,                            // level
+                                   b->Call<vec2<i32>>(5_i, 6_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1717,10 +1718,10 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_i);                         // level
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_i);                               // level
             },
             /* returns value */ true,
         },
@@ -1737,11 +1738,11 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_i,                          // array_index
-                                   5_i);                         // level
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_i,                                // array_index
+                                   5_i);                               // level
             },
             /* returns value */ true,
         },
@@ -1758,11 +1759,11 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   b->vec2<f32>(3_f, 4_f),   // ddx
-                                   b->vec2<f32>(5_f, 6_f));  // ddy
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   b->Call<vec2<f32>>(3_f, 4_f),   // ddx
+                                   b->Call<vec2<f32>>(5_f, 6_f));  // ddy
             },
             /* returns value */ true,
         },
@@ -1780,12 +1781,12 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   b->vec2<f32>(3_f, 4_f),   // ddx
-                                   b->vec2<f32>(5_f, 6_f),   // ddy
-                                   b->vec2<i32>(7_i, 7_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   b->Call<vec2<f32>>(3_f, 4_f),   // ddx
+                                   b->Call<vec2<f32>>(5_f, 6_f),   // ddy
+                                   b->Call<vec2<i32>>(7_i, 7_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1803,12 +1804,12 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_i,                      // array_index
-                                   b->vec2<f32>(4_f, 5_f),   // ddx
-                                   b->vec2<f32>(6_f, 7_f));  // ddy
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_i,                            // array_index
+                                   b->Call<vec2<f32>>(4_f, 5_f),   // ddx
+                                   b->Call<vec2<f32>>(6_f, 7_f));  // ddy
             },
             /* returns value */ true,
         },
@@ -1827,13 +1828,13 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_u,                      // array_index
-                                   b->vec2<f32>(4_f, 5_f),   // ddx
-                                   b->vec2<f32>(6_f, 7_f),   // ddy
-                                   b->vec2<i32>(6_i, 7_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_u,                            // array_index
+                                   b->Call<vec2<f32>>(4_f, 5_f),   // ddx
+                                   b->Call<vec2<f32>>(6_f, 7_f),   // ddy
+                                   b->Call<vec2<i32>>(6_i, 7_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1850,11 +1851,11 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                  // t
-                                   kSamplerName,                  // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),   // coords
-                                   b->vec3<f32>(4_f, 5_f, 6_f),   // ddx
-                                   b->vec3<f32>(7_f, 8_f, 9_f));  // ddy
+                return b->ExprList(kTextureName,                        // t
+                                   kSamplerName,                        // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),   // coords
+                                   b->Call<vec3<f32>>(4_f, 5_f, 6_f),   // ddx
+                                   b->Call<vec3<f32>>(7_f, 8_f, 9_f));  // ddy
             },
             /* returns value */ true,
         },
@@ -1872,12 +1873,12 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                  // t
-                                   kSamplerName,                  // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),   // coords
-                                   b->vec3<f32>(4_f, 5_f, 6_f),   // ddx
-                                   b->vec3<f32>(7_f, 8_f, 9_f),   // ddy
-                                   b->vec3<i32>(0_i, 1_i, 2_i));  // offset
+                return b->ExprList(kTextureName,                        // t
+                                   kSamplerName,                        // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),   // coords
+                                   b->Call<vec3<f32>>(4_f, 5_f, 6_f),   // ddx
+                                   b->Call<vec3<f32>>(7_f, 8_f, 9_f),   // ddy
+                                   b->Call<vec3<i32>>(0_i, 1_i, 2_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1894,11 +1895,11 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                  // t
-                                   kSamplerName,                  // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),   // coords
-                                   b->vec3<f32>(4_f, 5_f, 6_f),   // ddx
-                                   b->vec3<f32>(7_f, 8_f, 9_f));  // ddy
+                return b->ExprList(kTextureName,                        // t
+                                   kSamplerName,                        // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),   // coords
+                                   b->Call<vec3<f32>>(4_f, 5_f, 6_f),   // ddx
+                                   b->Call<vec3<f32>>(7_f, 8_f, 9_f));  // ddy
             },
             /* returns value */ true,
         },
@@ -1916,12 +1917,12 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                   // t
-                                   kSamplerName,                   // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),    // coords
-                                   4_u,                            // array_index
-                                   b->vec3<f32>(5_f, 6_f, 7_f),    // ddx
-                                   b->vec3<f32>(8_f, 9_f, 10_f));  // ddy
+                return b->ExprList(kTextureName,                         // t
+                                   kSamplerName,                         // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),    // coords
+                                   4_u,                                  // array_index
+                                   b->Call<vec3<f32>>(5_f, 6_f, 7_f),    // ddx
+                                   b->Call<vec3<f32>>(8_f, 9_f, 10_f));  // ddy
             },
             /* returns value */ true,
         },
@@ -1937,10 +1938,10 @@
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   3_f);                    // depth_ref
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   3_f);                          // depth_ref
             },
             /* returns value */ true,
         },
@@ -1957,11 +1958,11 @@
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_f,                      // depth_ref
-                                   b->vec2<i32>(4_i, 5_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_f,                            // depth_ref
+                                   b->Call<vec2<i32>>(4_i, 5_i));  // offset
             },
             /* returns value */ true,
         },
@@ -1978,11 +1979,11 @@
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   4_i,                     // array_index
-                                   3_f);                    // depth_ref
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   4_i,                           // array_index
+                                   3_f);                          // depth_ref
             },
             /* returns value */ true,
         },
@@ -2000,12 +2001,12 @@
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   4_u,                      // array_index
-                                   3_f,                      // depth_ref
-                                   b->vec2<i32>(5_i, 6_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   4_u,                            // array_index
+                                   3_f,                            // depth_ref
+                                   b->Call<vec2<i32>>(5_i, 6_i));  // offset
             },
             /* returns value */ true,
         },
@@ -2021,10 +2022,10 @@
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_f);                         // depth_ref
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_f);                               // depth_ref
             },
             /* returns value */ true,
         },
@@ -2041,11 +2042,11 @@
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_i,                          // array_index
-                                   5_f);                         // depth_ref
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_i,                                // array_index
+                                   5_f);                               // depth_ref
             },
             /* returns value */ true,
         },
@@ -2061,10 +2062,10 @@
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   3_f);                    // depth_ref
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   3_f);                          // depth_ref
             },
             /* returns value */ true,
         },
@@ -2081,11 +2082,11 @@
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_f,                      // depth_ref
-                                   b->vec2<i32>(4_i, 5_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_f,                            // depth_ref
+                                   b->Call<vec2<i32>>(4_i, 5_i));  // offset
             },
             /* returns value */ true,
         },
@@ -2102,11 +2103,11 @@
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   kSamplerName,            // s
-                                   b->vec2<f32>(1_f, 2_f),  // coords
-                                   3_i,                     // array_index
-                                   4_f);                    // depth_ref
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),  // coords
+                                   3_i,                           // array_index
+                                   4_f);                          // depth_ref
             },
             /* returns value */ true,
         },
@@ -2124,12 +2125,12 @@
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,             // t
-                                   kSamplerName,             // s
-                                   b->vec2<f32>(1_f, 2_f),   // coords
-                                   3_i,                      // array_index
-                                   4_f,                      // depth_ref
-                                   b->vec2<i32>(5_i, 6_i));  // offset
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
+                                   b->Call<vec2<f32>>(1_f, 2_f),   // coords
+                                   3_i,                            // array_index
+                                   4_f,                            // depth_ref
+                                   b->Call<vec2<i32>>(5_i, 6_i));  // offset
             },
             /* returns value */ true,
         },
@@ -2145,10 +2146,10 @@
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_f);                         // depth_ref
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_f);                               // depth_ref
             },
             /* returns value */ true,
         },
@@ -2165,11 +2166,11 @@
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   kSamplerName,                 // s
-                                   b->vec3<f32>(1_f, 2_f, 3_f),  // coords
-                                   4_i,                          // array_index
-                                   5_f);                         // depth_ref
+                return b->ExprList(kTextureName,                       // t
+                                   kSamplerName,                       // s
+                                   b->Call<vec3<f32>>(1_f, 2_f, 3_f),  // coords
+                                   4_i,                                // array_index
+                                   5_f);                               // depth_ref
             },
             /* returns value */ true,
         },
@@ -2231,9 +2232,9 @@
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   b->vec2<u32>(1_u, 2_u),  // coords
-                                   3_u);                    // level
+                return b->ExprList(kTextureName,                  // t
+                                   b->Call<vec2<u32>>(1_u, 2_u),  // coords
+                                   3_u);                          // level
             },
             /* returns value */ true,
         },
@@ -2247,9 +2248,9 @@
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   b->vec2<i32>(1_i, 2_i),  // coords
-                                   3_i);                    // level
+                return b->ExprList(kTextureName,                  // t
+                                   b->Call<vec2<i32>>(1_i, 2_i),  // coords
+                                   3_i);                          // level
             },
             /* returns value */ true,
         },
@@ -2263,9 +2264,9 @@
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   b->vec2<u32>(1_u, 2_u),  // coords
-                                   3_u);                    // level
+                return b->ExprList(kTextureName,                  // t
+                                   b->Call<vec2<u32>>(1_u, 2_u),  // coords
+                                   3_u);                          // level
             },
             /* returns value */ true,
         },
@@ -2280,10 +2281,10 @@
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   b->vec2<i32>(1_i, 2_i),  // coords
-                                   3_i,                     // array_index
-                                   4_i);                    // level
+                return b->ExprList(kTextureName,                  // t
+                                   b->Call<vec2<i32>>(1_i, 2_i),  // coords
+                                   3_i,                           // array_index
+                                   4_i);                          // level
             },
             /* returns value */ true,
         },
@@ -2298,10 +2299,10 @@
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   b->vec2<i32>(1_i, 2_i),  // coords
-                                   3_i,                     // array_index
-                                   4_i);                    // level
+                return b->ExprList(kTextureName,                  // t
+                                   b->Call<vec2<i32>>(1_i, 2_i),  // coords
+                                   3_i,                           // array_index
+                                   4_i);                          // level
             },
             /* returns value */ true,
         },
@@ -2316,10 +2317,10 @@
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   b->vec2<u32>(1_u, 2_u),  // coords
-                                   3_u,                     // array_index
-                                   4_u);                    // level
+                return b->ExprList(kTextureName,                  // t
+                                   b->Call<vec2<u32>>(1_u, 2_u),  // coords
+                                   3_u,                           // array_index
+                                   4_u);                          // level
             },
             /* returns value */ true,
         },
@@ -2333,9 +2334,9 @@
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   b->vec3<i32>(1_i, 2_i, 3_i),  // coords
-                                   4_i);                         // level
+                return b->ExprList(kTextureName,                       // t
+                                   b->Call<vec3<i32>>(1_i, 2_i, 3_i),  // coords
+                                   4_i);                               // level
             },
             /* returns value */ true,
         },
@@ -2349,9 +2350,9 @@
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   b->vec3<i32>(1_i, 2_i, 3_i),  // coords
-                                   4_i);                         // level
+                return b->ExprList(kTextureName,                       // t
+                                   b->Call<vec3<i32>>(1_i, 2_i, 3_i),  // coords
+                                   4_i);                               // level
             },
             /* returns value */ true,
         },
@@ -2365,9 +2366,9 @@
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                 // t
-                                   b->vec3<u32>(1_u, 2_u, 3_u),  // coords
-                                   4_u);                         // level
+                return b->ExprList(kTextureName,                       // t
+                                   b->Call<vec3<u32>>(1_u, 2_u, 3_u),  // coords
+                                   4_u);                               // level
             },
             /* returns value */ true,
         },
@@ -2381,9 +2382,9 @@
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   b->vec2<i32>(1_i, 2_i),  // coords
-                                   3_i);                    // sample_index
+                return b->ExprList(kTextureName,                  // t
+                                   b->Call<vec2<i32>>(1_i, 2_i),  // coords
+                                   3_i);                          // sample_index
             },
             /* returns value */ true,
         },
@@ -2397,9 +2398,9 @@
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   b->vec2<i32>(1_i, 2_i),  // coords
-                                   3_i);                    // sample_index
+                return b->ExprList(kTextureName,                  // t
+                                   b->Call<vec2<i32>>(1_i, 2_i),  // coords
+                                   3_i);                          // sample_index
             },
             /* returns value */ true,
         },
@@ -2413,9 +2414,9 @@
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   b->vec2<u32>(1_u, 2_u),  // coords
-                                   3_u);                    // sample_index
+                return b->ExprList(kTextureName,                  // t
+                                   b->Call<vec2<u32>>(1_u, 2_u),  // coords
+                                   3_u);                          // sample_index
             },
             /* returns value */ true,
         },
@@ -2429,9 +2430,9 @@
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   b->vec2<i32>(1_i, 2_i),  // coords
-                                   3_i);                    // level
+                return b->ExprList(kTextureName,                  // t
+                                   b->Call<vec2<i32>>(1_i, 2_i),  // coords
+                                   3_i);                          // level
             },
             /* returns value */ true,
         },
@@ -2446,10 +2447,10 @@
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   b->vec2<u32>(1_u, 2_u),  // coords
-                                   3_u,                     // array_index
-                                   4_u);                    // level
+                return b->ExprList(kTextureName,                  // t
+                                   b->Call<vec2<u32>>(1_u, 2_u),  // coords
+                                   3_u,                           // array_index
+                                   4_u);                          // level
             },
             /* returns value */ true,
         },
@@ -2463,9 +2464,9 @@
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,            // t
-                                   b->vec2<u32>(1_u, 2_u),  // coords
-                                   3_u);                    // sample_index
+                return b->ExprList(kTextureName,                  // t
+                                   b->Call<vec2<u32>>(1_u, 2_u),  // coords
+                                   3_u);                          // sample_index
             },
             /* returns value */ true,
         },
@@ -2480,9 +2481,9 @@
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                       // t
-                                   1_i,                                // coords
-                                   b->vec4<f32>(2_f, 3_f, 4_f, 5_f));  // value
+                return b->ExprList(kTextureName,                             // t
+                                   1_i,                                      // coords
+                                   b->Call<vec4<f32>>(2_f, 3_f, 4_f, 5_f));  // value
             },
             /* returns value */ false,
         },
@@ -2497,9 +2498,9 @@
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                       // t
-                                   b->vec2<i32>(1_i, 2_i),             // coords
-                                   b->vec4<f32>(3_f, 4_f, 5_f, 6_f));  // value
+                return b->ExprList(kTextureName,                             // t
+                                   b->Call<vec2<i32>>(1_i, 2_i),             // coords
+                                   b->Call<vec4<f32>>(3_f, 4_f, 5_f, 6_f));  // value
             },
             /* returns value */ false,
         },
@@ -2515,10 +2516,10 @@
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                       // t
-                                   b->vec2<u32>(1_u, 2_u),             // coords
-                                   3_u,                                // array_index
-                                   b->vec4<f32>(4_f, 5_f, 6_f, 7_f));  // value
+                return b->ExprList(kTextureName,                             // t
+                                   b->Call<vec2<u32>>(1_u, 2_u),             // coords
+                                   3_u,                                      // array_index
+                                   b->Call<vec4<f32>>(4_f, 5_f, 6_f, 7_f));  // value
             },
             /* returns value */ false,
         },
@@ -2533,9 +2534,9 @@
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
-                return b->ExprList(kTextureName,                       // t
-                                   b->vec3<u32>(1_u, 2_u, 3_u),        // coords
-                                   b->vec4<f32>(4_f, 5_f, 6_f, 7_f));  // value
+                return b->ExprList(kTextureName,                             // t
+                                   b->Call<vec3<u32>>(1_u, 2_u, 3_u),        // coords
+                                   b->Call<vec4<f32>>(4_f, 5_f, 6_f, 7_f));  // value
             },
             /* returns value */ false,
         },
diff --git a/src/tint/ast/transform/builtin_polyfill.cc b/src/tint/ast/transform/builtin_polyfill.cc
index 05f5da9..75d91b3 100644
--- a/src/tint/ast/transform/builtin_polyfill.cc
+++ b/src/tint/ast/transform/builtin_polyfill.cc
@@ -29,7 +29,8 @@
 #include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/map.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::BuiltinPolyfill);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::BuiltinPolyfill::Config);
@@ -767,7 +768,7 @@
         auto name = b.Symbols().New("tint_textureSampleBaseClampToEdge");
         auto body = utils::Vector{
             b.Decl(b.Let("dims", b.Call(b.ty.vec2<f32>(), b.Call("textureDimensions", "t", 0_a)))),
-            b.Decl(b.Let("half_texel", b.Div(b.vec2<f32>(0.5_a), "dims"))),
+            b.Decl(b.Let("half_texel", b.Div(b.Call<vec2<f32>>(0.5_a), "dims"))),
             b.Decl(
                 b.Let("clamped", b.Call("clamp", "coord", "half_texel", b.Sub(1_a, "half_texel")))),
             b.Return(b.Call("textureSampleLevel", "t", "s", "clamped", 0_a)),
@@ -814,7 +815,7 @@
         auto name = b.Symbols().New("tint_workgroupUniformLoad");
         b.Func(name,
                utils::Vector{
-                   b.Param("p", b.ty.ptr(builtin::AddressSpace::kWorkgroup, T(type))),
+                   b.Param("p", b.ty.ptr<workgroup>(T(type))),
                },
                T(type),
                utils::Vector{
diff --git a/src/tint/ast/transform/calculate_array_length.cc b/src/tint/ast/transform/calculate_array_length.cc
index 0e11ad4..4a1c0c8 100644
--- a/src/tint/ast/transform/calculate_array_length.cc
+++ b/src/tint/ast/transform/calculate_array_length.cc
@@ -35,7 +35,8 @@
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::CalculateArrayLength);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::CalculateArrayLength::BufferSizeIntrinsic);
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::ast::transform {
 
@@ -112,7 +113,7 @@
                        b.Param("buffer",
                                b.ty.ptr(buffer_type->AddressSpace(), type, buffer_type->Access()),
                                utils::Vector{disable_validation}),
-                       b.Param("result", b.ty.ptr(builtin::AddressSpace::kFunction, b.ty.u32())),
+                       b.Param("result", b.ty.ptr<function, u32>()),
                    },
                    b.ty.void_(), nullptr,
                    utils::Vector{
diff --git a/src/tint/ast/transform/decompose_strided_matrix_test.cc b/src/tint/ast/transform/decompose_strided_matrix_test.cc
index 4fa8017..bc1d416 100644
--- a/src/tint/ast/transform/decompose_strided_matrix_test.cc
+++ b/src/tint/ast/transform/decompose_strided_matrix_test.cc
@@ -24,7 +24,8 @@
 #include "src/tint/ast/transform/unshadow.h"
 #include "src/tint/program_builder.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::ast::transform {
 namespace {
@@ -356,15 +357,16 @@
                          });
     b.GlobalVar("s", b.ty.Of(S), builtin::AddressSpace::kStorage, builtin::Access::kReadWrite,
                 b.Group(0_a), b.Binding(0_a));
-    b.Func("f", utils::Empty, b.ty.void_(),
-           utils::Vector{
-               b.Assign(b.MemberAccessor("s", "m"),
-                        b.mat2x2<f32>(b.vec2<f32>(1_f, 2_f), b.vec2<f32>(3_f, 4_f))),
-           },
-           utils::Vector{
-               b.Stage(PipelineStage::kCompute),
-               b.WorkgroupSize(1_i),
-           });
+    b.Func(
+        "f", utils::Empty, b.ty.void_(),
+        utils::Vector{
+            b.Assign(b.MemberAccessor("s", "m"),
+                     b.Call<mat2x2<f32>>(b.Call<vec2<f32>>(1_f, 2_f), b.Call<vec2<f32>>(3_f, 4_f))),
+        },
+        utils::Vector{
+            b.Stage(PipelineStage::kCompute),
+            b.WorkgroupSize(1_i),
+        });
 
     auto* expect = R"(
 struct S {
@@ -415,14 +417,15 @@
                          });
     b.GlobalVar("s", b.ty.Of(S), builtin::AddressSpace::kStorage, builtin::Access::kReadWrite,
                 b.Group(0_a), b.Binding(0_a));
-    b.Func("f", utils::Empty, b.ty.void_(),
-           utils::Vector{
-               b.Assign(b.IndexAccessor(b.MemberAccessor("s", "m"), 1_i), b.vec2<f32>(1_f, 2_f)),
-           },
-           utils::Vector{
-               b.Stage(PipelineStage::kCompute),
-               b.WorkgroupSize(1_i),
-           });
+    b.Func(
+        "f", utils::Empty, b.ty.void_(),
+        utils::Vector{
+            b.Assign(b.IndexAccessor(b.MemberAccessor("s", "m"), 1_i), b.Call<vec2<f32>>(1_f, 2_f)),
+        },
+        utils::Vector{
+            b.Stage(PipelineStage::kCompute),
+            b.WorkgroupSize(1_i),
+        });
 
     auto* expect = R"(
 struct S {
@@ -482,8 +485,9 @@
                b.Decl(b.Let("x", b.Deref("b"))),
                b.Decl(b.Let("y", b.IndexAccessor(b.Deref("b"), 1_i))),
                b.Decl(b.Let("z", b.IndexAccessor("x", 1_i))),
-               b.Assign(b.Deref("b"), b.mat2x2<f32>(b.vec2<f32>(1_f, 2_f), b.vec2<f32>(3_f, 4_f))),
-               b.Assign(b.IndexAccessor(b.Deref("b"), 1_i), b.vec2<f32>(5_f, 6_f)),
+               b.Assign(b.Deref("b"), b.Call<mat2x2<f32>>(b.Call<vec2<f32>>(1_f, 2_f),
+                                                          b.Call<vec2<f32>>(3_f, 4_f))),
+               b.Assign(b.IndexAccessor(b.Deref("b"), 1_i), b.Call<vec2<f32>>(5_f, 6_f)),
            },
            utils::Vector{
                b.Stage(PipelineStage::kCompute),
@@ -600,15 +604,16 @@
                                       }),
                          });
     b.GlobalVar("s", b.ty.Of(S), builtin::AddressSpace::kPrivate);
-    b.Func("f", utils::Empty, b.ty.void_(),
-           utils::Vector{
-               b.Assign(b.MemberAccessor("s", "m"),
-                        b.mat2x2<f32>(b.vec2<f32>(1_f, 2_f), b.vec2<f32>(3_f, 4_f))),
-           },
-           utils::Vector{
-               b.Stage(PipelineStage::kCompute),
-               b.WorkgroupSize(1_i),
-           });
+    b.Func(
+        "f", utils::Empty, b.ty.void_(),
+        utils::Vector{
+            b.Assign(b.MemberAccessor("s", "m"),
+                     b.Call<mat2x2<f32>>(b.Call<vec2<f32>>(1_f, 2_f), b.Call<vec2<f32>>(3_f, 4_f))),
+        },
+        utils::Vector{
+            b.Stage(PipelineStage::kCompute),
+            b.WorkgroupSize(1_i),
+        });
 
     auto* expect = R"(
 struct S {
diff --git a/src/tint/ast/transform/module_scope_var_to_entry_point_param.cc b/src/tint/ast/transform/module_scope_var_to_entry_point_param.cc
index db06414..14112f0 100644
--- a/src/tint/ast/transform/module_scope_var_to_entry_point_param.cc
+++ b/src/tint/ast/transform/module_scope_var_to_entry_point_param.cc
@@ -30,6 +30,8 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::ModuleScopeVarToEntryPointParam);
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+
 namespace tint::ast::transform {
 namespace {
 
@@ -183,9 +185,7 @@
                     auto* member_ptr = ctx.dst->AddressOf(
                         ctx.dst->MemberAccessor(ctx.dst->Deref(workgroup_param()), member));
                     auto* local_var = ctx.dst->Let(
-                        new_var_symbol,
-                        ctx.dst->ty.ptr(builtin::AddressSpace::kWorkgroup, store_type()),
-                        member_ptr);
+                        new_var_symbol, ctx.dst->ty.ptr<workgroup>(store_type()), member_ptr);
                     ctx.InsertFront(func->body->statements, ctx.dst->Decl(local_var));
                     is_pointer = true;
                 } else {
@@ -427,8 +427,7 @@
                     }
                 } else {
                     // Create a parameter that is a pointer to the private variable struct.
-                    auto ptr = ctx.dst->ty.ptr(builtin::AddressSpace::kPrivate,
-                                               ctx.dst->ty(PrivateStructName()));
+                    auto ptr = ctx.dst->ty.ptr<private_>(ctx.dst->ty(PrivateStructName()));
                     auto* param = ctx.dst->Param(PrivateStructVariableName(), ptr);
                     ctx.InsertBack(func_ast->params, param);
                 }
@@ -489,8 +488,7 @@
                 // The parameter is a struct that contains members for each workgroup variable.
                 auto* str =
                     ctx.dst->Structure(ctx.dst->Sym(), std::move(workgroup_parameter_members));
-                auto param_type =
-                    ctx.dst->ty.ptr(builtin::AddressSpace::kWorkgroup, ctx.dst->ty.Of(str));
+                auto param_type = ctx.dst->ty.ptr(workgroup, ctx.dst->ty.Of(str));
                 auto* param =
                     ctx.dst->Param(workgroup_param(), param_type,
                                    utils::Vector{
diff --git a/src/tint/ast/transform/multiplanar_external_texture.cc b/src/tint/ast/transform/multiplanar_external_texture.cc
index 87844f8..9c4c62c 100644
--- a/src/tint/ast/transform/multiplanar_external_texture.cc
+++ b/src/tint/ast/transform/multiplanar_external_texture.cc
@@ -27,7 +27,8 @@
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::MultiplanarExternalTexture);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::MultiplanarExternalTexture::NewBindingPoints);
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::ast::transform {
 namespace {
@@ -270,34 +271,35 @@
     void createGammaCorrectionFn() {
         gamma_correction_sym = b.Symbols().New("gammaCorrection");
 
-        b.Func(
-            gamma_correction_sym,
-            utils::Vector{
-                b.Param("v", b.ty.vec3<f32>()),
-                b.Param("params", b.ty(gamma_transfer_struct_sym)),
-            },
-            b.ty.vec3<f32>(),
-            utils::Vector{
-                // let cond = abs(v) < vec3(params.D);
-                b.Decl(b.Let("cond", b.LessThan(b.Call("abs", "v"),
-                                                b.vec3<f32>(b.MemberAccessor("params", "D"))))),
-                // let t = sign(v) * ((params.C * abs(v)) + params.F);
-                b.Decl(b.Let("t",
-                             b.Mul(b.Call("sign", "v"),
-                                   b.Add(b.Mul(b.MemberAccessor("params", "C"), b.Call("abs", "v")),
-                                         b.MemberAccessor("params", "F"))))),
-                // let f = (sign(v) * pow(((params.A * abs(v)) + params.B),
-                // vec3(params.G))) + params.E;
-                b.Decl(b.Let("f", b.Mul(b.Call("sign", "v"),
-                                        b.Add(b.Call("pow",
-                                                     b.Add(b.Mul(b.MemberAccessor("params", "A"),
-                                                                 b.Call("abs", "v")),
-                                                           b.MemberAccessor("params", "B")),
-                                                     b.vec3<f32>(b.MemberAccessor("params", "G"))),
-                                              b.MemberAccessor("params", "E"))))),
-                // return select(f, t, cond);
-                b.Return(b.Call("select", "f", "t", "cond")),
-            });
+        b.Func(gamma_correction_sym,
+               utils::Vector{
+                   b.Param("v", b.ty.vec3<f32>()),
+                   b.Param("params", b.ty(gamma_transfer_struct_sym)),
+               },
+               b.ty.vec3<f32>(),
+               utils::Vector{
+                   // let cond = abs(v) < vec3(params.D);
+                   b.Decl(b.Let("cond",
+                                b.LessThan(b.Call("abs", "v"),
+                                           b.Call<vec3<f32>>(b.MemberAccessor("params", "D"))))),
+                   // let t = sign(v) * ((params.C * abs(v)) + params.F);
+                   b.Decl(b.Let(
+                       "t", b.Mul(b.Call("sign", "v"),
+                                  b.Add(b.Mul(b.MemberAccessor("params", "C"), b.Call("abs", "v")),
+                                        b.MemberAccessor("params", "F"))))),
+                   // let f = (sign(v) * pow(((params.A * abs(v)) + params.B),
+                   // vec3(params.G))) + params.E;
+                   b.Decl(b.Let(
+                       "f", b.Mul(b.Call("sign", "v"),
+                                  b.Add(b.Call("pow",
+                                               b.Add(b.Mul(b.MemberAccessor("params", "A"),
+                                                           b.Call("abs", "v")),
+                                                     b.MemberAccessor("params", "B")),
+                                               b.Call<vec3<f32>>(b.MemberAccessor("params", "G"))),
+                                        b.MemberAccessor("params", "E"))))),
+                   // return select(f, t, cond);
+                   b.Return(b.Call("select", "f", "t", "cond")),
+               });
     }
 
     /// Constructs a StatementList containing all the statements making up the body of the texture
@@ -313,21 +315,21 @@
             case builtin::Function::kTextureSampleBaseClampToEdge:
                 stmts.Push(b.Decl(b.Let(
                     "modifiedCoords", b.Mul(b.MemberAccessor("params", "coordTransformationMatrix"),
-                                            b.vec3<f32>("coord", 1_a)))));
+                                            b.Call<vec3<f32>>("coord", 1_a)))));
 
                 stmts.Push(b.Decl(
                     b.Let("plane0_dims",
                           b.Call(b.ty.vec2<f32>(), b.Call("textureDimensions", "plane0", 0_a)))));
-                stmts.Push(
-                    b.Decl(b.Let("plane0_half_texel", b.Div(b.vec2<f32>(0.5_a), "plane0_dims"))));
+                stmts.Push(b.Decl(
+                    b.Let("plane0_half_texel", b.Div(b.Call<vec2<f32>>(0.5_a), "plane0_dims"))));
                 stmts.Push(b.Decl(
                     b.Let("plane0_clamped", b.Call("clamp", "modifiedCoords", "plane0_half_texel",
                                                    b.Sub(1_a, "plane0_half_texel")))));
                 stmts.Push(b.Decl(
                     b.Let("plane1_dims",
                           b.Call(b.ty.vec2<f32>(), b.Call("textureDimensions", "plane1", 0_a)))));
-                stmts.Push(
-                    b.Decl(b.Let("plane1_half_texel", b.Div(b.vec2<f32>(0.5_a), "plane1_dims"))));
+                stmts.Push(b.Decl(
+                    b.Let("plane1_half_texel", b.Div(b.Call<vec2<f32>>(0.5_a), "plane1_dims"))));
                 stmts.Push(b.Decl(
                     b.Let("plane1_clamped", b.Call("clamp", "modifiedCoords", "plane1_half_texel",
                                                    b.Sub(1_a, "plane1_half_texel")))));
@@ -346,7 +348,7 @@
                 // textureLoad(plane0, coord, 0);
                 plane_0_call = b.Call("textureLoad", "plane0", "coord", 0_a);
                 // let coord1 = coord >> 1;
-                stmts.Push(b.Decl(b.Let("coord1", b.Shr("coord", b.vec2<u32>(1_a)))));
+                stmts.Push(b.Decl(b.Let("coord1", b.Shr("coord", b.Call<vec2<u32>>(1_a)))));
                 // textureLoad(plane1, coord1, 0);
                 plane_1_call = b.Call("textureLoad", "plane1", "coord1", 0_a);
                 break;
@@ -367,8 +369,8 @@
                      // color = vec4<f32>(plane_0_call.r, plane_1_call.rg, 1.0) *
                      //         params.yuvToRgbConversionMatrix;
                      b.Assign("color",
-                              b.Mul(b.vec4<f32>(b.MemberAccessor(plane_0_call, "r"),
-                                                b.MemberAccessor(plane_1_call, "rg"), 1_a),
+                              b.Mul(b.Call<vec4<f32>>(b.MemberAccessor(plane_0_call, "r"),
+                                                      b.MemberAccessor(plane_1_call, "rg"), 1_a),
                                     b.MemberAccessor("params", "yuvToRgbConversionMatrix")))))));
 
         // if (params.doYuvToRgbConversionOnly == 0u)
@@ -386,7 +388,7 @@
                                               b.MemberAccessor("params", "gammaEncodeParams"))))));
 
         // return vec4<f32>(color, 1.f);
-        stmts.Push(b.Return(b.vec4<f32>("color", 1_a)));
+        stmts.Push(b.Return(b.Call<vec4<f32>>("color", 1_a)));
 
         return stmts;
     }
diff --git a/src/tint/ast/transform/preserve_padding.cc b/src/tint/ast/transform/preserve_padding.cc
index 7d9143c..69e6d25 100644
--- a/src/tint/ast/transform/preserve_padding.cc
+++ b/src/tint/ast/transform/preserve_padding.cc
@@ -26,7 +26,8 @@
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::PreservePadding);
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::ast::transform {
 
@@ -122,8 +123,7 @@
                 auto helper_name = b.Symbols().New("assign_and_preserve_padding");
                 utils::Vector<const Parameter*, 2> params = {
                     b.Param(kDestParamName,
-                            b.ty.ptr(builtin::AddressSpace::kStorage, CreateASTTypeFor(ctx, ty),
-                                     builtin::Access::kReadWrite)),
+                            b.ty.ptr<storage, read_write>(CreateASTTypeFor(ctx, ty))),
                     b.Param(kValueParamName, CreateASTTypeFor(ctx, ty)),
                 };
                 b.Func(helper_name, params, b.ty.void_(), body());
diff --git a/src/tint/ast/transform/robustness.cc b/src/tint/ast/transform/robustness.cc
index aa94748..e0be9e5 100644
--- a/src/tint/ast/transform/robustness.cc
+++ b/src/tint/ast/transform/robustness.cc
@@ -35,7 +35,8 @@
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::Robustness);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::Robustness::Config);
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::ast::transform {
 
diff --git a/src/tint/ast/transform/vertex_pulling.cc b/src/tint/ast/transform/vertex_pulling.cc
index c2a543e..375bfc3 100644
--- a/src/tint/ast/transform/vertex_pulling.cc
+++ b/src/tint/ast/transform/vertex_pulling.cc
@@ -32,7 +32,8 @@
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::VertexPulling);
 TINT_INSTANTIATE_TYPEINFO(tint::ast::transform::VertexPulling::Config);
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::ast::transform {
 
@@ -576,71 +577,71 @@
 
             case VertexFormat::kUint8x2: {
                 // yyxx0000, yyxx0000
-                auto* u16s = b.vec2<u32>(load_u16_h());
+                auto* u16s = b.Call<vec2<u32>>(load_u16_h());
                 // xx000000, yyxx0000
-                auto* shl = b.Shl(u16s, b.vec2<u32>(8_u, 0_u));
+                auto* shl = b.Shl(u16s, b.Call<vec2<u32>>(8_u, 0_u));
                 // 000000xx, 000000yy
-                return b.Shr(shl, b.vec2<u32>(24_u));
+                return b.Shr(shl, b.Call<vec2<u32>>(24_u));
             }
             case VertexFormat::kUint8x4: {
                 // wwzzyyxx, wwzzyyxx, wwzzyyxx, wwzzyyxx
-                auto* u32s = b.vec4<u32>(load_u32());
+                auto* u32s = b.Call<vec4<u32>>(load_u32());
                 // xx000000, yyxx0000, zzyyxx00, wwzzyyxx
-                auto* shl = b.Shl(u32s, b.vec4<u32>(24_u, 16_u, 8_u, 0_u));
+                auto* shl = b.Shl(u32s, b.Call<vec4<u32>>(24_u, 16_u, 8_u, 0_u));
                 // 000000xx, 000000yy, 000000zz, 000000ww
-                return b.Shr(shl, b.vec4<u32>(24_u));
+                return b.Shr(shl, b.Call<vec4<u32>>(24_u));
             }
             case VertexFormat::kUint16x2: {
                 // yyyyxxxx, yyyyxxxx
-                auto* u32s = b.vec2<u32>(load_u32());
+                auto* u32s = b.Call<vec2<u32>>(load_u32());
                 // xxxx0000, yyyyxxxx
-                auto* shl = b.Shl(u32s, b.vec2<u32>(16_u, 0_u));
+                auto* shl = b.Shl(u32s, b.Call<vec2<u32>>(16_u, 0_u));
                 // 0000xxxx, 0000yyyy
-                return b.Shr(shl, b.vec2<u32>(16_u));
+                return b.Shr(shl, b.Call<vec2<u32>>(16_u));
             }
             case VertexFormat::kUint16x4: {
                 // yyyyxxxx, wwwwzzzz
-                auto* u32s = b.vec2<u32>(load_u32(), load_next_u32());
+                auto* u32s = b.Call<vec2<u32>>(load_u32(), load_next_u32());
                 // yyyyxxxx, yyyyxxxx, wwwwzzzz, wwwwzzzz
                 auto* xxyy = b.MemberAccessor(u32s, "xxyy");
                 // xxxx0000, yyyyxxxx, zzzz0000, wwwwzzzz
-                auto* shl = b.Shl(xxyy, b.vec4<u32>(16_u, 0_u, 16_u, 0_u));
+                auto* shl = b.Shl(xxyy, b.Call<vec4<u32>>(16_u, 0_u, 16_u, 0_u));
                 // 0000xxxx, 0000yyyy, 0000zzzz, 0000wwww
-                return b.Shr(shl, b.vec4<u32>(16_u));
+                return b.Shr(shl, b.Call<vec4<u32>>(16_u));
             }
             case VertexFormat::kSint8x2: {
                 // yyxx0000, yyxx0000
-                auto* i16s = b.vec2<i32>(load_i16_h());
+                auto* i16s = b.Call<vec2<i32>>(load_i16_h());
                 // xx000000, yyxx0000
-                auto* shl = b.Shl(i16s, b.vec2<u32>(8_u, 0_u));
+                auto* shl = b.Shl(i16s, b.Call<vec2<u32>>(8_u, 0_u));
                 // ssssssxx, ssssssyy
-                return b.Shr(shl, b.vec2<u32>(24_u));
+                return b.Shr(shl, b.Call<vec2<u32>>(24_u));
             }
             case VertexFormat::kSint8x4: {
                 // wwzzyyxx, wwzzyyxx, wwzzyyxx, wwzzyyxx
-                auto* i32s = b.vec4<i32>(load_i32());
+                auto* i32s = b.Call<vec4<i32>>(load_i32());
                 // xx000000, yyxx0000, zzyyxx00, wwzzyyxx
-                auto* shl = b.Shl(i32s, b.vec4<u32>(24_u, 16_u, 8_u, 0_u));
+                auto* shl = b.Shl(i32s, b.Call<vec4<u32>>(24_u, 16_u, 8_u, 0_u));
                 // ssssssxx, ssssssyy, sssssszz, ssssssww
-                return b.Shr(shl, b.vec4<u32>(24_u));
+                return b.Shr(shl, b.Call<vec4<u32>>(24_u));
             }
             case VertexFormat::kSint16x2: {
                 // yyyyxxxx, yyyyxxxx
-                auto* i32s = b.vec2<i32>(load_i32());
+                auto* i32s = b.Call<vec2<i32>>(load_i32());
                 // xxxx0000, yyyyxxxx
-                auto* shl = b.Shl(i32s, b.vec2<u32>(16_u, 0_u));
+                auto* shl = b.Shl(i32s, b.Call<vec2<u32>>(16_u, 0_u));
                 // ssssxxxx, ssssyyyy
-                return b.Shr(shl, b.vec2<u32>(16_u));
+                return b.Shr(shl, b.Call<vec2<u32>>(16_u));
             }
             case VertexFormat::kSint16x4: {
                 // yyyyxxxx, wwwwzzzz
-                auto* i32s = b.vec2<i32>(load_i32(), load_next_i32());
+                auto* i32s = b.Call<vec2<i32>>(load_i32(), load_next_i32());
                 // yyyyxxxx, yyyyxxxx, wwwwzzzz, wwwwzzzz
                 auto* xxyy = b.MemberAccessor(i32s, "xxyy");
                 // xxxx0000, yyyyxxxx, zzzz0000, wwwwzzzz
-                auto* shl = b.Shl(xxyy, b.vec4<u32>(16_u, 0_u, 16_u, 0_u));
+                auto* shl = b.Shl(xxyy, b.Call<vec4<u32>>(16_u, 0_u, 16_u, 0_u));
                 // ssssxxxx, ssssyyyy, sssszzzz, sssswwww
-                return b.Shr(shl, b.vec4<u32>(16_u));
+                return b.Shr(shl, b.Call<vec4<u32>>(16_u));
             }
             case VertexFormat::kUnorm8x2:
                 return b.MemberAccessor(b.Call("unpack4x8unorm", load_u16_l()), "xy");
@@ -657,14 +658,14 @@
             case VertexFormat::kFloat16x2:
                 return b.Call("unpack2x16float", load_u32());
             case VertexFormat::kUnorm16x4:
-                return b.vec4<f32>(b.Call("unpack2x16unorm", load_u32()),
-                                   b.Call("unpack2x16unorm", load_next_u32()));
+                return b.Call<vec4<f32>>(b.Call("unpack2x16unorm", load_u32()),
+                                         b.Call("unpack2x16unorm", load_next_u32()));
             case VertexFormat::kSnorm16x4:
-                return b.vec4<f32>(b.Call("unpack2x16snorm", load_u32()),
-                                   b.Call("unpack2x16snorm", load_next_u32()));
+                return b.Call<vec4<f32>>(b.Call("unpack2x16snorm", load_u32()),
+                                         b.Call("unpack2x16snorm", load_next_u32()));
             case VertexFormat::kFloat16x4:
-                return b.vec4<f32>(b.Call("unpack2x16float", load_u32()),
-                                   b.Call("unpack2x16float", load_next_u32()));
+                return b.Call<vec4<f32>>(b.Call("unpack2x16float", load_u32()),
+                                         b.Call("unpack2x16float", load_next_u32()));
         }
 
         TINT_UNREACHABLE(Transform, b.Diagnostics()) << "format " << static_cast<int>(format);
diff --git a/src/tint/builtin/fluent_types.h b/src/tint/builtin/fluent_types.h
new file mode 100644
index 0000000..925b54e
--- /dev/null
+++ b/src/tint/builtin/fluent_types.h
@@ -0,0 +1,237 @@
+// Copyright 2023 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef SRC_TINT_BUILTIN_FLUENT_TYPES_H_
+#define SRC_TINT_BUILTIN_FLUENT_TYPES_H_
+
+#include <stdint.h>
+
+#include "src/tint/builtin/access.h"
+#include "src/tint/builtin/address_space.h"
+#include "src/tint/builtin/number.h"
+
+namespace tint::builtin::fluent_types {
+
+// A sentinel type used by some template arguments to signal that the a type should be inferred.
+struct Infer {};
+
+/// A 'fluent' type helper used to construct an ast::Array or type::Array.
+/// @tparam T the array element type
+/// @tparam N the array length. 0 represents a runtime-sized array.
+/// @see https://www.w3.org/TR/WGSL/#array-types
+template <typename T = Infer, uint32_t N = 0>
+struct array {
+    /// the array element type
+    using type = T;
+    /// the array length. 0 represents a runtime-sized array.
+    static constexpr uint32_t length = N;
+};
+
+/// A 'fluent' type helper used to construct an ast::Atomic or type::Atomic.
+/// @tparam T the atomic element type
+/// @see https://www.w3.org/TR/WGSL/#atomic-types
+template <typename T>
+struct atomic {
+    /// the atomic element type
+    using type = T;
+};
+
+/// A 'fluent' type helper used to construct an ast::Vector or type::Vector.
+/// @tparam N the vector width
+/// @tparam T the vector element type
+template <uint32_t N, typename T = Infer>
+struct vec {
+    /// the vector width
+    static constexpr uint32_t width = N;
+    /// the vector element type
+    using type = T;
+};
+
+/// A 'fluent' type helper used to construct an ast::Matrix or type::Matrix.
+/// @tparam C the number of columns of the matrix
+/// @tparam R the number of rows of the matrix
+/// @tparam T the matrix element type
+/// @see https://www.w3.org/TR/WGSL/#matrix-types
+template <uint32_t C, uint32_t R, typename T = Infer>
+struct mat {
+    /// the number of columns of the matrix
+    static constexpr uint32_t columns = C;
+    /// the number of rows of the matrix
+    static constexpr uint32_t rows = R;
+    /// the matrix element type
+    using type = T;
+    /// the column vector type
+    using column = vec<R, T>;
+};
+
+/// A 'fluent' type helper used to construct an ast::Pointer or type::Pointer.
+/// @tparam ADDRESS the pointer address space
+/// @tparam T the pointer storage type
+/// @tparam ACCESS the pointer access control
+template <builtin::AddressSpace ADDRESS,
+          typename T,
+          builtin::Access ACCESS = builtin::Access::kUndefined>
+struct ptr {
+    /// the pointer address space
+    static constexpr builtin::AddressSpace address = ADDRESS;
+    /// the pointer storage type
+    using type = T;
+    /// the pointer access control
+    static constexpr builtin::Access access = ACCESS;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// Aliases
+//
+// Shorthand aliases for the types declared above
+////////////////////////////////////////////////////////////////////////////////
+
+//! @cond Doxygen_Suppress
+template <typename T>
+using mat2x2 = mat<2, 2, T>;
+
+template <typename T>
+using mat2x3 = mat<2, 3, T>;
+
+template <typename T>
+using mat2x4 = mat<2, 4, T>;
+
+template <typename T>
+using mat3x2 = mat<3, 2, T>;
+
+template <typename T>
+using mat3x3 = mat<3, 3, T>;
+
+template <typename T>
+using mat3x4 = mat<3, 4, T>;
+
+template <typename T>
+using mat4x2 = mat<4, 2, T>;
+
+template <typename T>
+using mat4x3 = mat<4, 3, T>;
+
+template <typename T>
+using mat4x4 = mat<4, 4, T>;
+
+template <typename T>
+using vec2 = vec<2, T>;
+
+template <typename T>
+using vec3 = vec<3, T>;
+
+template <typename T>
+using vec4 = vec<4, T>;
+
+//! @endcond
+
+////////////////////////////////////////////////////////////////////////////////
+// Address space aliases
+////////////////////////////////////////////////////////////////////////////////
+static constexpr builtin::AddressSpace function = builtin::AddressSpace::kFunction;
+static constexpr builtin::AddressSpace private_ = builtin::AddressSpace::kPrivate;
+static constexpr builtin::AddressSpace push_constant = builtin::AddressSpace::kPushConstant;
+static constexpr builtin::AddressSpace storage = builtin::AddressSpace::kStorage;
+static constexpr builtin::AddressSpace uniform = builtin::AddressSpace::kUniform;
+static constexpr builtin::AddressSpace workgroup = builtin::AddressSpace::kWorkgroup;
+
+////////////////////////////////////////////////////////////////////////////////
+// Access control aliases
+////////////////////////////////////////////////////////////////////////////////
+static constexpr builtin::Access read = builtin::Access::kRead;
+static constexpr builtin::Access read_write = builtin::Access::kReadWrite;
+static constexpr builtin::Access write = builtin::Access::kWrite;
+
+////////////////////////////////////////////////////////////////////////////////
+// Traits
+////////////////////////////////////////////////////////////////////////////////
+namespace detail {
+
+//! @cond Doxygen_Suppress
+template <typename T>
+struct IsArray {
+    static constexpr bool value = false;
+};
+
+template <typename T, uint32_t N>
+struct IsArray<array<T, N>> {
+    static constexpr bool value = true;
+};
+
+template <typename T>
+struct IsAtomic {
+    static constexpr bool value = false;
+};
+
+template <typename T>
+struct IsAtomic<atomic<T>> {
+    static constexpr bool value = true;
+};
+
+template <typename T>
+struct IsMatrix {
+    static constexpr bool value = false;
+};
+
+template <uint32_t C, uint32_t R, typename T>
+struct IsMatrix<mat<C, R, T>> {
+    static constexpr bool value = true;
+};
+
+template <typename T>
+struct IsVector {
+    static constexpr bool value = false;
+};
+
+template <uint32_t N, typename T>
+struct IsVector<vec<N, T>> {
+    static constexpr bool value = true;
+};
+
+template <typename T>
+struct IsPointer {
+    static constexpr bool value = false;
+};
+
+template <builtin::AddressSpace ADDRESS, typename T, builtin::Access ACCESS>
+struct IsPointer<ptr<ADDRESS, T, ACCESS>> {
+    static constexpr bool value = true;
+};
+//! @endcond
+
+}  // namespace detail
+
+/// Evaluates to true if `T` is a array
+template <typename T>
+static constexpr bool IsArray = fluent_types::detail::IsArray<T>::value;
+
+/// Evaluates to true if `T` is a atomic
+template <typename T>
+static constexpr bool IsAtomic = fluent_types::detail::IsAtomic<T>::value;
+
+/// Evaluates to true if `T` is a mat
+template <typename T>
+static constexpr bool IsMatrix = fluent_types::detail::IsMatrix<T>::value;
+
+/// Evaluates to true if `T` is a vec
+template <typename T>
+static constexpr bool IsVector = fluent_types::detail::IsVector<T>::value;
+
+/// Evaluates to true if `T` is a ptr
+template <typename T>
+static constexpr bool IsPointer = fluent_types::detail::IsPointer<T>::value;
+
+}  // namespace tint::builtin::fluent_types
+
+#endif  // SRC_TINT_BUILTIN_FLUENT_TYPES_H_
diff --git a/src/tint/number.cc b/src/tint/builtin/number.cc
similarity index 99%
rename from src/tint/number.cc
rename to src/tint/builtin/number.cc
index 8b85670..bf15fef 100644
--- a/src/tint/number.cc
+++ b/src/tint/builtin/number.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/number.h"
+#include "src/tint/builtin/number.h"
 
 #include <algorithm>
 #include <cmath>
@@ -345,7 +345,7 @@
 }
 
 // static
-Number<detail::NumberKindF16> f16::FromBits(uint16_t bits) {
+Number<tint::detail::NumberKindF16> f16::FromBits(uint16_t bits) {
     // Assert we use binary32 (i.e. float) as underlying type, which has 4 bytes.
     static_assert(std::is_same<f16::type, float>());
 
diff --git a/src/tint/number.h b/src/tint/builtin/number.h
similarity index 96%
rename from src/tint/number.h
rename to src/tint/builtin/number.h
index 06ab7fd..accc5e2 100644
--- a/src/tint/number.h
+++ b/src/tint/builtin/number.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef SRC_TINT_NUMBER_H_
-#define SRC_TINT_NUMBER_H_
+#ifndef SRC_TINT_BUILTIN_NUMBER_H_
+#define SRC_TINT_BUILTIN_NUMBER_H_
 
 #include <stdint.h>
 #include <cmath>
@@ -66,16 +66,16 @@
 
 /// Evaluates to true iff T is a Number
 template <typename T>
-constexpr bool IsNumber = detail::IsNumber<T>::value;
+constexpr bool IsNumber = tint::detail::IsNumber<T>::value;
 
 /// Resolves to the underlying type for a Number.
 template <typename T>
-using UnwrapNumber = typename detail::NumberUnwrapper<T>::type;
+using UnwrapNumber = typename tint::detail::NumberUnwrapper<T>::type;
 
 /// Evaluates to true iff T or Number<T> is a floating-point type or is NumberKindF16.
 template <typename T>
 constexpr bool IsFloatingPoint = std::is_floating_point_v<UnwrapNumber<T>> ||
-                                 std::is_same_v<UnwrapNumber<T>, detail::NumberKindF16>;
+                                 std::is_same_v<UnwrapNumber<T>, tint::detail::NumberKindF16>;
 
 /// Evaluates to true iff T or Number<T> is an integral type.
 template <typename T>
@@ -186,7 +186,7 @@
 /// The partial specification of Number for f16 type, storing the f16 value as float,
 /// and enforcing proper explicit casting.
 template <>
-struct Number<detail::NumberKindF16> : NumberBase<Number<detail::NumberKindF16>> {
+struct Number<tint::detail::NumberKindF16> : NumberBase<Number<tint::detail::NumberKindF16>> {
     /// C++ does not have a native float16 type, so we use a 32-bit float instead.
     using type = float;
 
@@ -226,7 +226,7 @@
 
     /// Negation operator
     /// @returns the negative value of the number
-    Number operator-() const { return Number<detail::NumberKindF16>(-value); }
+    Number operator-() const { return Number<tint::detail::NumberKindF16>(-value); }
 
     /// Assignment operator with parameter as native floating point type
     /// @param v the new value
@@ -246,7 +246,7 @@
     /// Creates an f16 value from the uint16_t bit representation.
     /// @param bits the bits to convert from
     /// @returns the binary16 value based off the provided bit pattern.
-    static Number<detail::NumberKindF16> FromBits(uint16_t bits);
+    static Number<tint::detail::NumberKindF16> FromBits(uint16_t bits);
 
     /// @param value the input float32 value
     /// @returns the float32 value quantized to the smaller float16 value, through truncation of the
@@ -272,7 +272,7 @@
 using f32 = Number<float>;
 /// `f16` is a type alias to `Number<detail::NumberKindF16>`, which should be IEEE 754 binary16.
 /// However since C++ don't have native binary16 type, the value is stored as float.
-using f16 = Number<detail::NumberKindF16>;
+using f16 = Number<tint::detail::NumberKindF16>;
 
 template <typename T, utils::traits::EnableIf<IsFloatingPoint<T>>* = nullptr>
 inline const auto kPi = T(UnwrapNumber<T>(3.14159265358979323846));
@@ -576,7 +576,7 @@
         return {};
     }
 
-    return AInt{detail::Mod(a.value, b.value)};
+    return AInt{tint::detail::Mod(a.value, b.value)};
 }
 
 /// @returns the remainder of a / b, or an empty optional if the resulting value overflowed the
@@ -587,7 +587,7 @@
     if (b == FloatingPointT{0.0} || b == FloatingPointT{-0.0}) {
         return {};
     }
-    auto result = FloatingPointT{detail::Mod(a.value, b.value)};
+    auto result = FloatingPointT{tint::detail::Mod(a.value, b.value)};
     if (!std::isfinite(result.value)) {
         return {};
     }
@@ -681,4 +681,4 @@
 
 }  // namespace std
 
-#endif  // SRC_TINT_NUMBER_H_
+#endif  // SRC_TINT_BUILTIN_NUMBER_H_
diff --git a/src/tint/number_test.cc b/src/tint/builtin/number_test.cc
similarity index 100%
rename from src/tint/number_test.cc
rename to src/tint/builtin/number_test.cc
diff --git a/src/tint/constant/composite.h b/src/tint/constant/composite.h
index 23367a5..c2f264c 100644
--- a/src/tint/constant/composite.h
+++ b/src/tint/constant/composite.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_CONSTANT_COMPOSITE_H_
 #define SRC_TINT_CONSTANT_COMPOSITE_H_
 
+#include "src/tint/builtin/number.h"
 #include "src/tint/constant/value.h"
-#include "src/tint/number.h"
 #include "src/tint/type/type.h"
 #include "src/tint/utils/castable.h"
 #include "src/tint/utils/hash.h"
diff --git a/src/tint/constant/manager.h b/src/tint/constant/manager.h
index d356988..43d50496 100644
--- a/src/tint/constant/manager.h
+++ b/src/tint/constant/manager.h
@@ -17,8 +17,8 @@
 
 #include <utility>
 
+#include "src/tint/builtin/number.h"
 #include "src/tint/constant/value.h"
-#include "src/tint/number.h"
 #include "src/tint/type/manager.h"
 #include "src/tint/utils/hash.h"
 #include "src/tint/utils/unique_allocator.h"
diff --git a/src/tint/constant/scalar.h b/src/tint/constant/scalar.h
index 23684ec..442bc59 100644
--- a/src/tint/constant/scalar.h
+++ b/src/tint/constant/scalar.h
@@ -15,9 +15,9 @@
 #ifndef SRC_TINT_CONSTANT_SCALAR_H_
 #define SRC_TINT_CONSTANT_SCALAR_H_
 
+#include "src/tint/builtin/number.h"
 #include "src/tint/constant/manager.h"
 #include "src/tint/constant/value.h"
-#include "src/tint/number.h"
 #include "src/tint/type/type.h"
 #include "src/tint/utils/castable.h"
 #include "src/tint/utils/hash.h"
diff --git a/src/tint/constant/value.h b/src/tint/constant/value.h
index baf1171..34ca335 100644
--- a/src/tint/constant/value.h
+++ b/src/tint/constant/value.h
@@ -17,9 +17,9 @@
 
 #include <variant>
 
+#include "src/tint/builtin/number.h"
 #include "src/tint/constant/clone_context.h"
 #include "src/tint/constant/node.h"
-#include "src/tint/number.h"
 #include "src/tint/type/type.h"
 #include "src/tint/utils/castable.h"
 
diff --git a/src/tint/ir/access_test.cc b/src/tint/ir/access_test.cc
index 1f0e947..9d461b1 100644
--- a/src/tint/ir/access_test.cc
+++ b/src/tint/ir/access_test.cc
@@ -18,6 +18,8 @@
 #include "gtest/gtest-spi.h"
 #include "src/tint/ir/ir_test_helper.h"
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+
 namespace tint::ir {
 namespace {
 
diff --git a/src/tint/ir/from_program_accessor_test.cc b/src/tint/ir/from_program_accessor_test.cc
index d8e6601..3628f10 100644
--- a/src/tint/ir/from_program_accessor_test.cc
+++ b/src/tint/ir/from_program_accessor_test.cc
@@ -24,7 +24,8 @@
 namespace tint::ir {
 namespace {
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 using IR_FromProgramAccessorTest = ProgramTestHelper;
 
@@ -348,7 +349,7 @@
     // let a: mat3x4<f32> = mat3x4<u32>()
     // let b = a[2][3]
 
-    auto* a = Let("a", ty.mat3x4<f32>(), mat3x4<f32>());
+    auto* a = Let("a", ty.mat3x4<f32>(), Call<mat3x4<f32>>());
     auto* expr = Decl(Let("b", IndexAccessor(IndexAccessor(a, 2_u), 3_u)));
     WrapInFunction(Block(utils::Vector{Decl(a), expr}));
 
@@ -448,7 +449,7 @@
                                          Member("a", ty.i32()),
                                          Member("foo", ty.array(ty.Of(inner), 4_u)),
                                      });
-    auto* a = Let("a", ty.array(ty.Of(outer), 4_u), array(ty.Of(outer), 4_u));
+    auto* a = Let("a", ty.array(ty.Of(outer), 4_u), Call(ty.array(ty.Of(outer), 4_u)));
     auto* expr = Decl(Let(
         "b",
         MemberAccessor(IndexAccessor(MemberAccessor(IndexAccessor(a, 0_u), "foo"), 1_u), "bar")));
diff --git a/src/tint/ir/from_program_call_test.cc b/src/tint/ir/from_program_call_test.cc
index ce89975..1148f56 100644
--- a/src/tint/ir/from_program_call_test.cc
+++ b/src/tint/ir/from_program_call_test.cc
@@ -21,7 +21,8 @@
 namespace tint::ir {
 namespace {
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 using IR_FromProgramCallTest = ProgramTestHelper;
 
@@ -92,7 +93,7 @@
 
 TEST_F(IR_FromProgramCallTest, EmitExpression_Convert) {
     auto i = GlobalVar("i", builtin::AddressSpace::kPrivate, Expr(1_i));
-    auto* expr = Call(ty.f32(), i);
+    auto* expr = Call<f32>(i);
     WrapInFunction(expr);
 
     auto m = Build();
@@ -114,7 +115,7 @@
 }
 
 TEST_F(IR_FromProgramCallTest, EmitExpression_ConstructEmpty) {
-    auto* expr = vec3(ty.f32());
+    auto* expr = Call<vec3<f32>>();
     GlobalVar("i", builtin::AddressSpace::kPrivate, expr);
 
     auto m = Build();
@@ -130,7 +131,7 @@
 
 TEST_F(IR_FromProgramCallTest, EmitExpression_Construct) {
     auto i = GlobalVar("i", builtin::AddressSpace::kPrivate, Expr(1_f));
-    auto* expr = vec3(ty.f32(), 2_f, 3_f, i);
+    auto* expr = Call<vec3<f32>>(2_f, 3_f, i);
     WrapInFunction(expr);
 
     auto m = Build();
diff --git a/src/tint/ir/from_program_function_test.cc b/src/tint/ir/from_program_function_test.cc
index c467f28..2fce0e7 100644
--- a/src/tint/ir/from_program_function_test.cc
+++ b/src/tint/ir/from_program_function_test.cc
@@ -21,12 +21,14 @@
 namespace tint::ir {
 namespace {
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 using IR_FromProgramFunctionTest = ProgramTestHelper;
 
 TEST_F(IR_FromProgramFunctionTest, EmitFunction_Vertex) {
-    Func("test", utils::Empty, ty.vec4<f32>(), utils::Vector{Return(vec4<f32>(0_f, 0_f, 0_f, 0_f))},
+    Func("test", utils::Empty, ty.vec4<f32>(),
+         utils::Vector{Return(Call<vec4<f32>>(0_f, 0_f, 0_f, 0_f))},
          utils::Vector{Stage(ast::PipelineStage::kVertex)},
          utils::Vector{Builtin(builtin::BuiltinValue::kPosition)});
 
@@ -73,8 +75,8 @@
 }
 
 TEST_F(IR_FromProgramFunctionTest, EmitFunction_Return) {
-    Func("test", utils::Empty, ty.vec3<f32>(), utils::Vector{Return(vec3<f32>(0_f, 0_f, 0_f))},
-         utils::Empty);
+    Func("test", utils::Empty, ty.vec3<f32>(),
+         utils::Vector{Return(Call<vec3<f32>>(0_f, 0_f, 0_f))}, utils::Empty);
 
     auto m = Build();
     ASSERT_TRUE(m) << (!m ? m.Failure() : "");
@@ -88,7 +90,8 @@
 }
 
 TEST_F(IR_FromProgramFunctionTest, EmitFunction_ReturnPosition) {
-    Func("test", utils::Empty, ty.vec4<f32>(), utils::Vector{Return(vec4<f32>(1_f, 2_f, 3_f, 4_f))},
+    Func("test", utils::Empty, ty.vec4<f32>(),
+         utils::Vector{Return(Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f))},
          utils::Vector{Stage(ast::PipelineStage::kVertex)},
          utils::Vector{Builtin(builtin::BuiltinValue::kPosition)});
 
@@ -104,7 +107,8 @@
 }
 
 TEST_F(IR_FromProgramFunctionTest, EmitFunction_ReturnPositionInvariant) {
-    Func("test", utils::Empty, ty.vec4<f32>(), utils::Vector{Return(vec4<f32>(1_f, 2_f, 3_f, 4_f))},
+    Func("test", utils::Empty, ty.vec4<f32>(),
+         utils::Vector{Return(Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f))},
          utils::Vector{Stage(ast::PipelineStage::kVertex)},
          utils::Vector{Builtin(builtin::BuiltinValue::kPosition), Invariant()});
 
@@ -121,7 +125,8 @@
 }
 
 TEST_F(IR_FromProgramFunctionTest, EmitFunction_ReturnLocation) {
-    Func("test", utils::Empty, ty.vec4<f32>(), utils::Vector{Return(vec4<f32>(1_f, 2_f, 3_f, 4_f))},
+    Func("test", utils::Empty, ty.vec4<f32>(),
+         utils::Vector{Return(Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f))},
          utils::Vector{Stage(ast::PipelineStage::kFragment)}, utils::Vector{Location(1_i)});
 
     auto m = Build();
@@ -137,7 +142,8 @@
 }
 
 TEST_F(IR_FromProgramFunctionTest, EmitFunction_ReturnLocation_Interpolate) {
-    Func("test", utils::Empty, ty.vec4<f32>(), utils::Vector{Return(vec4<f32>(1_f, 2_f, 3_f, 4_f))},
+    Func("test", utils::Empty, ty.vec4<f32>(),
+         utils::Vector{Return(Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f))},
          utils::Vector{Stage(ast::PipelineStage::kFragment)},
          utils::Vector{Location(1_i), Interpolate(builtin::InterpolationType::kLinear,
                                                   builtin::InterpolationSampling::kCentroid)});
diff --git a/src/tint/ir/ir_test_helper.h b/src/tint/ir/ir_test_helper.h
index 737a596..0406606 100644
--- a/src/tint/ir/ir_test_helper.h
+++ b/src/tint/ir/ir_test_helper.h
@@ -34,15 +34,6 @@
     Builder b{mod};
     /// The type manager
     type::Manager& ty{mod.Types()};
-
-    /// Alias to builtin::AddressSpace::kStorage
-    static constexpr auto storage = builtin::AddressSpace::kStorage;
-    /// Alias to builtin::AddressSpace::kUniform
-    static constexpr auto uniform = builtin::AddressSpace::kUniform;
-    /// Alias to builtin::AddressSpace::kPrivate
-    static constexpr auto private_ = builtin::AddressSpace::kPrivate;
-    /// Alias to builtin::AddressSpace::kFunction
-    static constexpr auto function = builtin::AddressSpace::kFunction;
 };
 
 using IRTestHelper = IRTestHelperBase<testing::Test>;
diff --git a/src/tint/ir/load_test.cc b/src/tint/ir/load_test.cc
index 0cfba85..6f9ddb1 100644
--- a/src/tint/ir/load_test.cc
+++ b/src/tint/ir/load_test.cc
@@ -21,14 +21,14 @@
 namespace tint::ir {
 namespace {
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 using IR_LoadTest = IRTestHelper;
 
 TEST_F(IR_LoadTest, Create) {
     auto* store_type = ty.i32();
-    auto* var =
-        b.Var(ty.ptr(builtin::AddressSpace::kFunction, store_type, builtin::Access::kReadWrite));
+    auto* var = b.Var(ty.ptr<function, i32>());
     auto* inst = b.Load(var);
 
     ASSERT_TRUE(inst->Is<Load>());
@@ -41,9 +41,7 @@
 }
 
 TEST_F(IR_LoadTest, Usage) {
-    auto* store_type = ty.i32();
-    auto* var =
-        b.Var(ty.ptr(builtin::AddressSpace::kFunction, store_type, builtin::Access::kReadWrite));
+    auto* var = b.Var(ty.ptr<function, i32>());
     auto* inst = b.Load(var);
 
     ASSERT_NE(inst->From(), nullptr);
@@ -71,13 +69,7 @@
 }
 
 TEST_F(IR_LoadTest, Fail_NullValue) {
-    EXPECT_FATAL_FAILURE(
-        {
-            Module mod;
-            Builder b{mod};
-            Load l(nullptr);
-        },
-        "");
+    EXPECT_FATAL_FAILURE({ Load l(nullptr); }, "");
 }
 
 }  // namespace
diff --git a/src/tint/ir/module_test.cc b/src/tint/ir/module_test.cc
index 61cd5d4..d2621aa 100644
--- a/src/tint/ir/module_test.cc
+++ b/src/tint/ir/module_test.cc
@@ -19,37 +19,33 @@
 namespace tint::ir {
 namespace {
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
-class IR_ModuleTest : public IRTestHelper {
-  protected:
-    const type::Pointer* ptr(const type::Type* elem) {
-        return ty.ptr(builtin::AddressSpace::kFunction, elem, builtin::Access::kReadWrite);
-    }
-};
+using IR_ModuleTest = IRTestHelper;
 
 TEST_F(IR_ModuleTest, NameOfUnnamed) {
-    auto* v = mod.values.Create<ir::Var>(ptr(ty.i32()));
+    auto* v = mod.values.Create<ir::Var>(ty.ptr<function, i32>());
     EXPECT_FALSE(mod.NameOf(v).IsValid());
 }
 
 TEST_F(IR_ModuleTest, SetName) {
-    auto* v = mod.values.Create<ir::Var>(ptr(ty.i32()));
+    auto* v = mod.values.Create<ir::Var>(ty.ptr<function, i32>());
     EXPECT_EQ(mod.SetName(v, "a").Name(), "a");
     EXPECT_EQ(mod.NameOf(v).Name(), "a");
 }
 
 TEST_F(IR_ModuleTest, SetNameRename) {
-    auto* v = mod.values.Create<ir::Var>(ptr(ty.i32()));
+    auto* v = mod.values.Create<ir::Var>(ty.ptr<function, i32>());
     EXPECT_EQ(mod.SetName(v, "a").Name(), "a");
     EXPECT_EQ(mod.SetName(v, "b").Name(), "b");
     EXPECT_EQ(mod.NameOf(v).Name(), "b");
 }
 
 TEST_F(IR_ModuleTest, SetNameCollision) {
-    auto* a = mod.values.Create<ir::Var>(ptr(ty.i32()));
-    auto* b = mod.values.Create<ir::Var>(ptr(ty.i32()));
-    auto* c = mod.values.Create<ir::Var>(ptr(ty.i32()));
+    auto* a = mod.values.Create<ir::Var>(ty.ptr<function, i32>());
+    auto* b = mod.values.Create<ir::Var>(ty.ptr<function, i32>());
+    auto* c = mod.values.Create<ir::Var>(ty.ptr<function, i32>());
     EXPECT_EQ(mod.SetName(a, "x").Name(), "x");
     EXPECT_EQ(mod.SetName(b, "x_1").Name(), "x_1");
     EXPECT_EQ(mod.SetName(c, "x").Name(), "x_2");
diff --git a/src/tint/ir/program_test_helper.h b/src/tint/ir/program_test_helper.h
index 3ce88f0..d982366 100644
--- a/src/tint/ir/program_test_helper.h
+++ b/src/tint/ir/program_test_helper.h
@@ -20,9 +20,9 @@
 #include <utility>
 
 #include "gtest/gtest.h"
+#include "src/tint/builtin/number.h"
 #include "src/tint/ir/disassembler.h"
 #include "src/tint/ir/from_program.h"
-#include "src/tint/number.h"
 #include "src/tint/program_builder.h"
 #include "src/tint/utils/string_stream.h"
 
diff --git a/src/tint/ir/store_test.cc b/src/tint/ir/store_test.cc
index 5578005..5582eb4 100644
--- a/src/tint/ir/store_test.cc
+++ b/src/tint/ir/store_test.cc
@@ -21,13 +21,13 @@
 namespace tint::ir {
 namespace {
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 using IR_StoreTest = IRTestHelper;
 
 TEST_F(IR_StoreTest, CreateStore) {
-    auto* to = b.Var(mod.Types().ptr(builtin::AddressSpace::kPrivate, mod.Types().i32(),
-                                     builtin::Access::kReadWrite));
+    auto* to = b.Var(ty.ptr<private_, i32>());
     auto* inst = b.Store(to, 4_i);
 
     ASSERT_TRUE(inst->Is<Store>());
@@ -65,8 +65,7 @@
         {
             Module mod;
             Builder b{mod};
-            auto* to = b.Var(mod.Types().ptr(builtin::AddressSpace::kPrivate, mod.Types().i32(),
-                                             builtin::Access::kReadWrite));
+            auto* to = b.Var(mod.Types().ptr<private_, i32>());
             b.Store(to, nullptr);
         },
         "");
diff --git a/src/tint/ir/swizzle_test.cc b/src/tint/ir/swizzle_test.cc
index ada269d4..58df467 100644
--- a/src/tint/ir/swizzle_test.cc
+++ b/src/tint/ir/swizzle_test.cc
@@ -18,6 +18,8 @@
 #include "gtest/gtest-spi.h"
 #include "src/tint/ir/ir_test_helper.h"
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+
 namespace tint::ir {
 namespace {
 
diff --git a/src/tint/ir/transform/block_decorated_structs_test.cc b/src/tint/ir/transform/block_decorated_structs_test.cc
index e86c563..a333894 100644
--- a/src/tint/ir/transform/block_decorated_structs_test.cc
+++ b/src/tint/ir/transform/block_decorated_structs_test.cc
@@ -21,13 +21,14 @@
 #include "src/tint/type/pointer.h"
 #include "src/tint/type/struct.h"
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 namespace tint::ir::transform {
 namespace {
 
 using IR_BlockDecoratedStructsTest = TransformTest;
 
-using namespace tint::number_suffixes;  // NOLINT
-
 TEST_F(IR_BlockDecoratedStructsTest, NoRootBlock) {
     auto* func = b.Function("foo", ty.void_());
     func->StartTarget()->Append(b.Return(func));
@@ -116,7 +117,7 @@
 }
 
 TEST_F(IR_BlockDecoratedStructsTest, RuntimeArray) {
-    auto* buffer = b.Var(ty.ptr(storage, ty.runtime_array(ty.i32()), builtin::Access::kReadWrite));
+    auto* buffer = b.Var(ty.ptr<storage, array<i32>>());
     buffer->SetBindingPoint(0, 0);
     b.RootBlock()->Append(buffer);
 
@@ -219,8 +220,7 @@
     buffer->SetBindingPoint(0, 0);
     b.RootBlock()->Append(buffer);
 
-    auto* private_var =
-        b.Var(ty.ptr(builtin::AddressSpace::kPrivate, structure, builtin::Access::kReadWrite));
+    auto* private_var = b.Var(ty.ptr<private_, read_write>(structure));
     b.RootBlock()->Append(private_var);
 
     auto* func = b.Function("foo", ty.void_());
diff --git a/src/tint/ir/transform/test_helper.h b/src/tint/ir/transform/test_helper.h
index ea75fcf..83ff8c2 100644
--- a/src/tint/ir/transform/test_helper.h
+++ b/src/tint/ir/transform/test_helper.h
@@ -60,15 +60,6 @@
     /// The type manager.
     type::Manager& ty{mod.Types()};
 
-    /// Alias to builtin::AddressSpace::kStorage
-    static constexpr auto storage = builtin::AddressSpace::kStorage;
-    /// Alias to builtin::AddressSpace::kUniform
-    static constexpr auto uniform = builtin::AddressSpace::kUniform;
-    /// Alias to builtin::AddressSpace::kPrivate
-    static constexpr auto private_ = builtin::AddressSpace::kPrivate;
-    /// Alias to builtin::AddressSpace::kFunction
-    static constexpr auto function = builtin::AddressSpace::kFunction;
-
   private:
     std::vector<std::unique_ptr<Source::File>> files_;
 };
diff --git a/src/tint/ir/transform/var_for_dynamic_index_test.cc b/src/tint/ir/transform/var_for_dynamic_index_test.cc
index 6b64025..d9b7b8c 100644
--- a/src/tint/ir/transform/var_for_dynamic_index_test.cc
+++ b/src/tint/ir/transform/var_for_dynamic_index_test.cc
@@ -21,17 +21,13 @@
 #include "src/tint/type/matrix.h"
 #include "src/tint/type/struct.h"
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 namespace tint::ir::transform {
 namespace {
 
-using namespace tint::number_suffixes;  // NOLINT
-
-class IR_VarForDynamicIndexTest : public TransformTest {
-  protected:
-    const type::Type* ptr(const type::Type* elem) {
-        return ty.ptr(builtin::AddressSpace::kFunction, elem, builtin::Access::kReadWrite);
-    }
-};
+using IR_VarForDynamicIndexTest = TransformTest;
 
 TEST_F(IR_VarForDynamicIndexTest, NoModify_ConstantIndex_ArrayValue) {
     auto* arr = b.FunctionParam(ty.array<i32, 4u>());
@@ -82,13 +78,13 @@
 }
 
 TEST_F(IR_VarForDynamicIndexTest, NoModify_DynamicIndex_ArrayPointer) {
-    auto* arr = b.FunctionParam(ptr(ty.array<i32, 4u>()));
+    auto* arr = b.FunctionParam(ty.ptr<function, array<i32, 4u>>());
     auto* idx = b.FunctionParam(ty.i32());
     auto* func = b.Function("foo", ty.i32());
     func->SetParams({arr, idx});
 
     auto* block = func->StartTarget();
-    auto* access = block->Append(b.Access(ptr(ty.i32()), arr, idx));
+    auto* access = block->Append(b.Access(ty.ptr<function, i32>(), arr, idx));
     auto* load = block->Append(b.Load(access));
     block->Append(b.Return(func, load));
     mod.functions.Push(func);
@@ -109,13 +105,13 @@
 }
 
 TEST_F(IR_VarForDynamicIndexTest, NoModify_DynamicIndex_MatrixPointer) {
-    auto* mat = b.FunctionParam(ptr(ty.mat2x2<f32>()));
+    auto* mat = b.FunctionParam(ty.ptr<function, mat2x2<f32>>());
     auto* idx = b.FunctionParam(ty.i32());
     auto* func = b.Function("foo", ty.f32());
     func->SetParams({mat, idx});
 
     auto* block = func->StartTarget();
-    auto* access = block->Append(b.Access(ptr(ty.f32()), mat, idx, idx));
+    auto* access = block->Append(b.Access(ty.ptr<function, f32>(), mat, idx, idx));
     auto* load = block->Append(b.Load(access));
     block->Append(b.Return(func, load));
     mod.functions.Push(func);
diff --git a/src/tint/ir/validate_test.cc b/src/tint/ir/validate_test.cc
index d49b0dd..b24843e 100644
--- a/src/tint/ir/validate_test.cc
+++ b/src/tint/ir/validate_test.cc
@@ -22,17 +22,17 @@
 #include "src/tint/type/pointer.h"
 #include "src/tint/type/struct.h"
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 namespace tint::ir {
 namespace {
 
-using namespace tint::number_suffixes;  // NOLINT
-
 using IR_ValidateTest = IRTestHelper;
 
 TEST_F(IR_ValidateTest, RootBlock_Var) {
     mod.root_block = b.RootBlock();
-    mod.root_block->Append(
-        b.Var(ty.ptr(builtin::AddressSpace::kPrivate, ty.i32(), builtin::Access::kReadWrite)));
+    mod.root_block->Append(b.Var(ty.ptr<private_, i32>()));
     auto res = ir::Validate(mod);
     EXPECT_TRUE(res) << res.Failure().str();
 }
@@ -113,8 +113,7 @@
 
 TEST_F(IR_ValidateTest, Valid_Access_Ptr) {
     auto* f = b.Function("my_func", ty.void_());
-    auto* obj = b.FunctionParam(
-        ty.ptr(builtin::AddressSpace::kPrivate, ty.mat3x2<f32>(), builtin::Access::kReadWrite));
+    auto* obj = b.FunctionParam(ty.ptr<private_, mat3x2<f32>>());
     f->SetParams({obj});
     mod.functions.Push(f);
 
@@ -192,8 +191,7 @@
 
 TEST_F(IR_ValidateTest, Access_OOB_Index_Ptr) {
     auto* f = b.Function("my_func", ty.void_());
-    auto* obj = b.FunctionParam(
-        ty.ptr(builtin::AddressSpace::kPrivate, ty.mat3x2<f32>(), builtin::Access::kReadWrite));
+    auto* obj = b.FunctionParam(ty.ptr<private_, mat3x2<f32>>());
     f->SetParams({obj});
     mod.functions.Push(f);
 
@@ -341,8 +339,7 @@
     auto* str_ty = ty.Get<type::Struct>(mod.symbols.New(), std::move(members), 4u, 8u, 8u);
 
     auto* f = b.Function("my_func", ty.void_());
-    auto* obj = b.FunctionParam(
-        ty.ptr(builtin::AddressSpace::kPrivate, str_ty, builtin::Access::kReadWrite));
+    auto* obj = b.FunctionParam(ty.ptr<private_, read_write>(str_ty));
     auto* idx = b.FunctionParam(ty.i32());
     f->SetParams({obj, idx});
     mod.functions.Push(f);
@@ -410,8 +407,7 @@
 
 TEST_F(IR_ValidateTest, Access_Incorrect_Type_Ptr_Ptr) {
     auto* f = b.Function("my_func", ty.void_());
-    auto* obj = b.FunctionParam(
-        ty.ptr(builtin::AddressSpace::kPrivate, ty.mat3x2<f32>(), builtin::Access::kReadWrite));
+    auto* obj = b.FunctionParam(ty.ptr<private_, mat3x2<f32>>());
     f->SetParams({obj});
     mod.functions.Push(f);
 
@@ -443,8 +439,7 @@
 
 TEST_F(IR_ValidateTest, Access_Incorrect_Type_Ptr_Value) {
     auto* f = b.Function("my_func", ty.void_());
-    auto* obj = b.FunctionParam(
-        ty.ptr(builtin::AddressSpace::kPrivate, ty.mat3x2<f32>(), builtin::Access::kReadWrite));
+    auto* obj = b.FunctionParam(ty.ptr<private_, mat3x2<f32>>());
     f->SetParams({obj});
     mod.functions.Push(f);
 
diff --git a/src/tint/ir/var_test.cc b/src/tint/ir/var_test.cc
index 7173237..1896e05 100644
--- a/src/tint/ir/var_test.cc
+++ b/src/tint/ir/var_test.cc
@@ -23,7 +23,9 @@
 namespace tint::ir {
 namespace {
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using IR_VarTest = IRTestHelper;
 
 TEST_F(IR_VarTest, Fail_NullType) {
diff --git a/src/tint/program_builder.h b/src/tint/program_builder.h
index 52a73b3..4f4788f 100644
--- a/src/tint/program_builder.h
+++ b/src/tint/program_builder.h
@@ -76,10 +76,11 @@
 #include "src/tint/ast/while_statement.h"
 #include "src/tint/ast/workgroup_attribute.h"
 #include "src/tint/builtin/extension.h"
+#include "src/tint/builtin/fluent_types.h"
 #include "src/tint/builtin/interpolation_sampling.h"
 #include "src/tint/builtin/interpolation_type.h"
+#include "src/tint/builtin/number.h"
 #include "src/tint/constant/manager.h"
-#include "src/tint/number.h"
 #include "src/tint/program.h"
 #include "src/tint/program_id.h"
 #include "src/tint/sem/array_count.h"
@@ -117,13 +118,10 @@
 
 namespace tint {
 
-// A sentinel type used by some template arguments to signal that the a type should be inferred.
-struct Infer {};
-
 /// Evaluates to true if T is a Infer, AInt or AFloat.
 template <typename T>
 static constexpr const bool IsInferOrAbstract =
-    std::is_same_v<std::decay_t<T>, Infer> || IsAbstract<std::decay_t<T>>;
+    std::is_same_v<std::decay_t<T>, builtin::fluent_types::Infer> || IsAbstract<std::decay_t<T>>;
 
 // Forward declare metafunction that evaluates to true iff T can be wrapped in a statement.
 template <typename T, typename = void>
@@ -1007,17 +1005,6 @@
             return array(builder->source_, subtype, std::move(attrs));
         }
 
-        /// @param subtype the array element type
-        /// @param n the array size. nullptr represents a runtime-array
-        /// @param attrs the optional attributes for the array
-        /// @return an array of size `n` of type `T`
-        template <typename COUNT, typename = DisableIfVectorLike<COUNT>>
-        ast::Type array(ast::Type subtype,
-                        COUNT&& n,
-                        utils::VectorRef<const ast::Attribute*> attrs = utils::Empty) const {
-            return array(builder->source_, subtype, std::forward<COUNT>(n), std::move(attrs));
-        }
-
         /// @param source the Source of the node
         /// @param subtype the array element type
         /// @param attrs the optional attributes for the array
@@ -1033,6 +1020,17 @@
                                                           std::move(attrs)))};
         }
 
+        /// @param subtype the array element type
+        /// @param n the array size. nullptr represents a runtime-array
+        /// @param attrs the optional attributes for the array
+        /// @return an array of size `n` of type `T`
+        template <typename COUNT, typename = DisableIfVectorLike<COUNT>>
+        ast::Type array(ast::Type subtype,
+                        COUNT&& n,
+                        utils::VectorRef<const ast::Attribute*> attrs = utils::Empty) const {
+            return array(builder->source_, subtype, std::forward<COUNT>(n), std::move(attrs));
+        }
+
         /// @param source the Source of the node
         /// @param subtype the array element type
         /// @param n the array size. nullptr represents a runtime-array
@@ -1054,53 +1052,47 @@
 
         /// @param source the Source of the node
         /// @return a inferred-size or runtime-sized array of type `T`
-        template <typename T, typename = EnableIfInferOrAbstract<T>>
+        template <typename T, int N = 0, typename = EnableIfInferOrAbstract<T>>
         ast::Type array(const Source& source) const {
+            static_assert(N == 0, "arrays with a count cannot be inferred");
             return (*this)(source, "array");
         }
 
         /// @return a inferred-size or runtime-sized array of type `T`
-        template <typename T, typename = EnableIfInferOrAbstract<T>>
+        template <typename T, int N = 0, typename = EnableIfInferOrAbstract<T>>
         ast::Type array() const {
+            static_assert(N == 0, "arrays with a count cannot be inferred");
             return array<T>(builder->source_);
         }
 
         /// @param source the Source of the node
         /// @param attrs the optional attributes for the array
         /// @return a inferred-size or runtime-sized array of type `T`
-        template <typename T, typename = DisableIfInferOrAbstract<T>>
+        template <typename T, int N = 0, typename = DisableIfInferOrAbstract<T>>
         ast::Type array(const Source& source,
                         utils::VectorRef<const ast::Attribute*> attrs = utils::Empty) const {
-            return ast::Type{builder->Expr(
-                builder->create<ast::TemplatedIdentifier>(source, builder->Sym("array"),
-                                                          utils::Vector<const ast::Expression*, 1>{
-                                                              Of<T>().expr,
-                                                          },
-                                                          std::move(attrs)))};
-        }
-
-        /// @param attrs the optional attributes for the array
-        /// @return a inferred-size or runtime-sized array of type `T`
-        template <typename T, typename = DisableIfInferOrAbstract<T>>
-        ast::Type array(utils::VectorRef<const ast::Attribute*> attrs = utils::Empty) const {
-            return array<T>(builder->source_, std::move(attrs));
-        }
-
-        /// @param source the Source of the node
-        /// @param attrs the optional attributes for the array
-        /// @return an array of size `N` of type `T`
-        template <typename T, int N>
-        ast::Type array(const Source& source,
-                        utils::VectorRef<const ast::Attribute*> attrs = utils::Empty) const {
-            static_assert(!IsInferOrAbstract<T>, "arrays with a count cannot be inferred");
-            return array(source, Of<T>(), tint::u32(N), std::move(attrs));
+            if constexpr (N == 0) {
+                return ast::Type{builder->Expr(builder->create<ast::TemplatedIdentifier>(
+                    source, builder->Sym("array"),
+                    utils::Vector<const ast::Expression*, 1>{
+                        Of<T>().expr,
+                    },
+                    std::move(attrs)))};
+            } else {
+                return ast::Type{builder->Expr(builder->create<ast::TemplatedIdentifier>(
+                    source, builder->Sym("array"),
+                    utils::Vector{
+                        Of<T>().expr,
+                        builder->Expr(builder->source_, tint::u32(N)),
+                    },
+                    std::move(attrs)))};
+            }
         }
 
         /// @param attrs the optional attributes for the array
         /// @return an array of size `N` of type `T`
-        template <typename T, int N>
+        template <typename T, int N = 0, typename = DisableIfInferOrAbstract<T>>
         ast::Type array(utils::VectorRef<const ast::Attribute*> attrs = utils::Empty) const {
-            static_assert(!IsInferOrAbstract<T>, "arrays with a count cannot be inferred");
             return array<T, N>(builder->source_, std::move(attrs));
         }
 
@@ -1160,9 +1152,48 @@
         }
 
         /// @param source the Source of the node
+        /// @return the pointer to type `T` with the builtin::AddressSpace `ADDRESS` and access
+        /// control `ACCESS`.
+        template <builtin::AddressSpace ADDRESS,
+                  typename T,
+                  builtin::Access ACCESS = builtin::Access::kUndefined>
+        ast::Type ptr(const Source& source) const {
+            return ptr<T>(source, ADDRESS, ACCESS);
+        }
+
+        /// @param type the type of the pointer
+        /// @return the pointer to the given type with the builtin::AddressSpace `ADDRESS` and
+        /// access control `ACCESS`.
+        template <builtin::AddressSpace ADDRESS,
+                  builtin::Access ACCESS = builtin::Access::kUndefined>
+        ast::Type ptr(ast::Type type) const {
+            return ptr(builder->source_, ADDRESS, type, ACCESS);
+        }
+
+        /// @param source the Source of the node
+        /// @param type the type of the pointer
+        /// @return the pointer to the given type with the builtin::AddressSpace `ADDRESS` and
+        /// access control `ACCESS`.
+        template <builtin::AddressSpace ADDRESS,
+                  builtin::Access ACCESS = builtin::Access::kUndefined>
+        ast::Type ptr(const Source& source, ast::Type type) const {
+            return ptr(source, ADDRESS, type, ACCESS);
+        }
+
+        /// @return the pointer to type `T` with the builtin::AddressSpace `ADDRESS` and access
+        /// control `ACCESS`.
+        template <builtin::AddressSpace ADDRESS,
+                  typename T,
+                  builtin::Access ACCESS = builtin::Access::kUndefined>
+        ast::Type ptr() const {
+            return ptr<T>(builder->source_, ADDRESS, ACCESS);
+        }
+
+        /// @param source the Source of the node
         /// @param address_space the address space of the pointer
         /// @param access the optional access control of the pointer
-        /// @return the pointer to type `T` with the given builtin::AddressSpace.
+        /// @return the pointer to type `T` the builtin::AddressSpace `ADDRESS` and access control
+        /// `ACCESS`.
         template <typename T>
         ast::Type ptr(const Source& source,
                       builtin::AddressSpace address_space,
@@ -1654,325 +1685,6 @@
         return Call(source, ty.vec(type, size), std::forward<ARGS>(args)...);
     }
 
-    /// @param args the arguments for the vector constructor
-    /// @return an `ast::CallExpression` of a 2-element vector of type `T`, constructed with the
-    /// values @p args.
-    template <typename T, typename... ARGS, typename = DisableIfSource<ARGS...>>
-    const ast::CallExpression* vec2(ARGS&&... args) {
-        return vec2<T>(source_, std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the vector source
-    /// @param args the arguments for the vector constructor
-    /// @return an `ast::CallExpression` of a 2-element vector of type `T`, constructed with the
-    /// values @p args.
-    template <typename T, typename... ARGS>
-    const ast::CallExpression* vec2(const Source& source, ARGS&&... args) {
-        return Call(source, ty.vec2<T>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param type the element type of the vector
-    /// @param args the arguments for the vector constructor
-    /// @return an `ast::CallExpression` of a 2-element vector of type @p type, constructed with the
-    /// values @p args.
-    template <typename... ARGS>
-    const ast::CallExpression* vec2(ast::Type type, ARGS&&... args) {
-        return vec2(source_, type, std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the vector source
-    /// @param type the element type of the vector
-    /// @param args the arguments for the vector constructor
-    /// @return an `ast::CallExpression` of a 2-element vector of type @p type, constructed with the
-    /// values @p args.
-    template <typename... ARGS>
-    const ast::CallExpression* vec2(const Source& source, ast::Type type, ARGS&&... args) {
-        return Call(source, ty.vec2(type), std::forward<ARGS>(args)...);
-    }
-
-    /// @param args the arguments for the vector constructor
-    /// @return an `ast::CallExpression` of a 3-element vector of type `T`, constructed with the
-    /// values @p args.
-    template <typename T, typename... ARGS, typename = DisableIfSource<ARGS...>>
-    const ast::CallExpression* vec3(ARGS&&... args) {
-        return vec3<T>(source_, std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the vector source
-    /// @param args the arguments for the vector constructor
-    /// @return an `ast::CallExpression` of a 3-element vector of type `T`, constructed with the
-    /// values @p args.
-    template <typename T, typename... ARGS>
-    const ast::CallExpression* vec3(const Source& source, ARGS&&... args) {
-        return Call(source, ty.vec3<T>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param type the element type of the vector
-    /// @param args the arguments for the vector constructor
-    /// @return an `ast::CallExpression` of a 3-element vector of type @p type, constructed with the
-    /// values @p args.
-    template <typename... ARGS>
-    const ast::CallExpression* vec3(ast::Type type, ARGS&&... args) {
-        return vec3(source_, type, std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the vector source
-    /// @param type the element type of the vector
-    /// @param args the arguments for the vector constructor
-    /// @return an `ast::CallExpression` of a 3-element vector of type @p type, constructed with the
-    /// values @p args.
-    template <typename... ARGS>
-    const ast::CallExpression* vec3(const Source& source, ast::Type type, ARGS&&... args) {
-        return Call(source, ty.vec3(type), std::forward<ARGS>(args)...);
-    }
-
-    /// @param args the arguments for the vector constructor
-    /// @return an `ast::CallExpression` of a 4-element vector of type `T`, constructed with the
-    /// values @p args.
-    template <typename T, typename... ARGS, typename = DisableIfSource<ARGS...>>
-    const ast::CallExpression* vec4(ARGS&&... args) {
-        return vec4<T>(source_, std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the vector source
-    /// @param args the arguments for the vector constructor
-    /// @return an `ast::CallExpression` of a 4-element vector of type `T`, constructed with the
-    /// values @p args.
-    template <typename T, typename... ARGS>
-    const ast::CallExpression* vec4(const Source& source, ARGS&&... args) {
-        return Call(source, ty.vec4<T>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param type the element type of the vector
-    /// @param args the arguments for the vector constructor
-    /// @return an `ast::CallExpression` of a 4-element vector of type @p type, constructed with the
-    /// values @p args.
-    template <typename... ARGS>
-    const ast::CallExpression* vec4(ast::Type type, ARGS&&... args) {
-        return vec4(source_, type, std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the vector source
-    /// @param type the element type of the vector
-    /// @param args the arguments for the vector constructor
-    /// @return an `ast::CallExpression` of a 4-element vector of type @p type, constructed with the
-    /// values @p args.
-    template <typename... ARGS>
-    const ast::CallExpression* vec4(const Source& source, ast::Type type, ARGS&&... args) {
-        return Call(source, ty.vec4(type), std::forward<ARGS>(args)...);
-    }
-
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 2x2 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS, typename = DisableIfSource<ARGS...>>
-    const ast::CallExpression* mat2x2(ARGS&&... args) {
-        return mat2x2<T>(source_, std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the matrix source
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 2x2 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS>
-    const ast::CallExpression* mat2x2(const Source& source, ARGS&&... args) {
-        return Call(source, ty.mat2x2<T>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 2x3 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS, typename = DisableIfSource<ARGS...>>
-    const ast::CallExpression* mat2x3(ARGS&&... args) {
-        return mat2x3<T>(source_, std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the matrix source
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 2x3 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS>
-    const ast::CallExpression* mat2x3(const Source& source, ARGS&&... args) {
-        return Call(source, ty.mat2x3<T>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 2x4 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS, typename = DisableIfSource<ARGS...>>
-    const ast::CallExpression* mat2x4(ARGS&&... args) {
-        return mat2x4<T>(source_, std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the matrix source
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 2x4 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS>
-    const ast::CallExpression* mat2x4(const Source& source, ARGS&&... args) {
-        return Call(source, ty.mat2x4<T>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 3x2 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS, typename = DisableIfSource<ARGS...>>
-    const ast::CallExpression* mat3x2(ARGS&&... args) {
-        return mat3x2<T>(source_, std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the matrix source
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 3x2 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS>
-    const ast::CallExpression* mat3x2(const Source& source, ARGS&&... args) {
-        return Call(source, ty.mat3x2<T>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 3x3 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS, typename = DisableIfSource<ARGS...>>
-    const ast::CallExpression* mat3x3(ARGS&&... args) {
-        return mat3x3<T>(source_, std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the matrix source
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 3x3 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS>
-    const ast::CallExpression* mat3x3(const Source& source, ARGS&&... args) {
-        return Call(source, ty.mat3x3<T>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 3x4 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS, typename = DisableIfSource<ARGS...>>
-    const ast::CallExpression* mat3x4(ARGS&&... args) {
-        return mat3x4<T>(source_, std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the matrix source
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 3x4 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS>
-    const ast::CallExpression* mat3x4(const Source& source, ARGS&&... args) {
-        return Call(source, ty.mat3x4<T>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 4x2 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS, typename = DisableIfSource<ARGS...>>
-    const ast::CallExpression* mat4x2(ARGS&&... args) {
-        return mat4x2<T>(source_, std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the matrix source
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 4x2 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS>
-    const ast::CallExpression* mat4x2(const Source& source, ARGS&&... args) {
-        return Call(source, ty.mat4x2<T>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 4x3 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS, typename = DisableIfSource<ARGS...>>
-    const ast::CallExpression* mat4x3(ARGS&&... args) {
-        return mat4x3<T>(source_, std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the matrix source
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 4x3 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS>
-    const ast::CallExpression* mat4x3(const Source& source, ARGS&&... args) {
-        return Call(source, ty.mat4x3<T>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 4x4 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS, typename = DisableIfSource<ARGS...>>
-    const ast::CallExpression* mat4x4(ARGS&&... args) {
-        return mat4x4<T>(source_, std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the matrix source
-    /// @param args the arguments for the matrix constructor
-    /// @return an `ast::CallExpression` of a 4x4 matrix of type
-    /// `T`, constructed with the values @p args.
-    template <typename T, typename... ARGS>
-    const ast::CallExpression* mat4x4(const Source& source, ARGS&&... args) {
-        return Call(source, ty.mat4x4<T>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param args the arguments for the array constructor
-    /// @return an `ast::CallExpression` of an array with element type `T`, constructed with the
-    /// values @p args.
-    template <typename T, typename... ARGS, typename = DisableIfSource<ARGS...>>
-    const ast::CallExpression* array(ARGS&&... args) {
-        return Call(ty.array<T>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the array source
-    /// @param args the arguments for the array constructor
-    /// @return an `ast::CallExpression` of an array with element type `T`, constructed with the
-    /// values @p args.
-    template <typename T, typename... ARGS>
-    const ast::CallExpression* array(const Source& source, ARGS&&... args) {
-        return Call(source, ty.array<T>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param args the arguments for the array constructor
-    /// @return an `ast::CallExpression` of an array with element type `T` and size `N`, constructed
-    /// with the values @p args.
-    template <typename T, int N, typename... ARGS, typename = DisableIfSource<ARGS...>>
-    const ast::CallExpression* array(ARGS&&... args) {
-        return Call(ty.array<T, N>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the array source
-    /// @param args the arguments for the array constructor
-    /// @return an `ast::CallExpression` of an array with element type `T` and size `N`, constructed
-    /// with the values @p args.
-    template <typename T, int N, typename... ARGS>
-    const ast::CallExpression* array(const Source& source, ARGS&&... args) {
-        return Call(source, ty.array<T, N>(), std::forward<ARGS>(args)...);
-    }
-
-    /// @param subtype the array element type
-    /// @param n the array size. nullptr represents a runtime-array.
-    /// @param args the arguments for the array constructor
-    /// @return an `ast::CallExpression` of an array with element type
-    /// `subtype`, constructed with the values @p args.
-    template <typename EXPR, typename... ARGS>
-    const ast::CallExpression* array(ast::Type subtype, EXPR&& n, ARGS&&... args) {
-        return Call(ty.array(subtype, std::forward<EXPR>(n)), std::forward<ARGS>(args)...);
-    }
-
-    /// @param source the array source
-    /// @param subtype the array element type
-    /// @param n the array size. nullptr represents a runtime-array.
-    /// @param args the arguments for the array constructor
-    /// @return an `ast::CallExpression` of an array with element type
-    /// `subtype`, constructed with the values @p args.
-    template <typename EXPR, typename... ARGS>
-    const ast::CallExpression* array(const Source& source,
-                                     ast::Type subtype,
-                                     EXPR&& n,
-                                     ARGS&&... args) {
-        return Call(source, ty.array(subtype, std::forward<EXPR>(n)), std::forward<ARGS>(args)...);
-    }
-
     /// Adds the extension to the list of enable directives at the top of the module.
     /// @param extension the extension to enable
     /// @return an `ast::Enable` enabling the given extension.
@@ -3933,6 +3645,28 @@
 struct ProgramBuilder::TypesBuilder::CToAST<bool> {
     static ast::Type get(const ProgramBuilder::TypesBuilder* t) { return t->bool_(); }
 };
+template <typename T, uint32_t N>
+struct ProgramBuilder::TypesBuilder::CToAST<tint::builtin::fluent_types::array<T, N>> {
+    static ast::Type get(const ProgramBuilder::TypesBuilder* t) { return t->array<T, N>(); }
+};
+template <typename T>
+struct ProgramBuilder::TypesBuilder::CToAST<tint::builtin::fluent_types::atomic<T>> {
+    static ast::Type get(const ProgramBuilder::TypesBuilder* t) { return t->atomic<T>(); }
+};
+template <uint32_t C, uint32_t R, typename T>
+struct ProgramBuilder::TypesBuilder::CToAST<tint::builtin::fluent_types::mat<C, R, T>> {
+    static ast::Type get(const ProgramBuilder::TypesBuilder* t) { return t->mat<T>(C, R); }
+};
+template <uint32_t N, typename T>
+struct ProgramBuilder::TypesBuilder::CToAST<tint::builtin::fluent_types::vec<N, T>> {
+    static ast::Type get(const ProgramBuilder::TypesBuilder* t) { return t->vec<T, N>(); }
+};
+template <builtin::AddressSpace ADDRESS, typename T, builtin::Access ACCESS>
+struct ProgramBuilder::TypesBuilder::CToAST<tint::builtin::fluent_types::ptr<ADDRESS, T, ACCESS>> {
+    static ast::Type get(const ProgramBuilder::TypesBuilder* t) {
+        return t->ptr<ADDRESS, T, ACCESS>();
+    }
+};
 //! @endcond
 
 /// @param builder the ProgramBuilder
diff --git a/src/tint/program_id.h b/src/tint/program_id.h
index 4169ba1..35ab476 100644
--- a/src/tint/program_id.h
+++ b/src/tint/program_id.h
@@ -103,11 +103,11 @@
 /// valid program identifiers.
 #if TINT_CHECK_FOR_CROSS_PROGRAM_LEAKS
 #define TINT_ASSERT_PROGRAM_IDS_EQUAL(system, a, b)                        \
-    detail::AssertProgramIDsEqual(                                         \
+    tint::detail::AssertProgramIDsEqual(                                   \
         ProgramIDOf(a), ProgramIDOf(b), false, tint::diag::System::system, \
         "TINT_ASSERT_PROGRAM_IDS_EQUAL(" #system "," #a ", " #b ")", __FILE__, __LINE__)
 #define TINT_ASSERT_PROGRAM_IDS_EQUAL_IF_VALID(system, a, b)              \
-    detail::AssertProgramIDsEqual(                                        \
+    tint::detail::AssertProgramIDsEqual(                                  \
         ProgramIDOf(a), ProgramIDOf(b), true, tint::diag::System::system, \
         "TINT_ASSERT_PROGRAM_IDS_EQUAL_IF_VALID(" #system ", " #a ", " #b ")", __FILE__, __LINE__)
 #else
diff --git a/src/tint/reader/wgsl/lexer.cc b/src/tint/reader/wgsl/lexer.cc
index 304a545..ac42988 100644
--- a/src/tint/reader/wgsl/lexer.cc
+++ b/src/tint/reader/wgsl/lexer.cc
@@ -25,8 +25,8 @@
 #include <type_traits>
 #include <utility>
 
+#include "src/tint/builtin/number.h"
 #include "src/tint/debug.h"
-#include "src/tint/number.h"
 #include "src/tint/utils/parse_num.h"
 #include "src/tint/utils/unicode.h"
 
diff --git a/src/tint/reader/wgsl/lexer_test.cc b/src/tint/reader/wgsl/lexer_test.cc
index 8d49bf8..a705de0 100644
--- a/src/tint/reader/wgsl/lexer_test.cc
+++ b/src/tint/reader/wgsl/lexer_test.cc
@@ -19,7 +19,7 @@
 #include <vector>
 
 #include "gtest/gtest.h"
-#include "src/tint/number.h"
+#include "src/tint/builtin/number.h"
 
 namespace tint::reader::wgsl {
 namespace {
diff --git a/src/tint/reader/wgsl/parser_impl.h b/src/tint/reader/wgsl/parser_impl.h
index b167f56..1151fc4 100644
--- a/src/tint/reader/wgsl/parser_impl.h
+++ b/src/tint/reader/wgsl/parser_impl.h
@@ -121,9 +121,9 @@
         /// std::unique_ptr, operator->() automatically dereferences so that the
         /// return type will always be a pointer to a non-pointer type. #errored
         /// must be false to call.
-        inline typename detail::OperatorArrow<T>::type operator->() {
+        inline typename wgsl::detail::OperatorArrow<T>::type operator->() {
             TINT_ASSERT(Reader, !errored);
-            return detail::OperatorArrow<T>::ptr(value);
+            return wgsl::detail::OperatorArrow<T>::ptr(value);
         }
 
         /// The expected value of a successful parse.
@@ -183,9 +183,9 @@
         /// std::unique_ptr, operator->() automatically dereferences so that the
         /// return type will always be a pointer to a non-pointer type. #errored
         /// must be false to call.
-        inline typename detail::OperatorArrow<T>::type operator->() {
+        inline typename wgsl::detail::OperatorArrow<T>::type operator->() {
             TINT_ASSERT(Reader, !errored);
-            return detail::OperatorArrow<T>::ptr(value);
+            return wgsl::detail::OperatorArrow<T>::ptr(value);
         }
 
         /// The value of a successful parse.
diff --git a/src/tint/reflection.h b/src/tint/reflection.h
index d341f98..e965200 100644
--- a/src/tint/reflection.h
+++ b/src/tint/reflection.h
@@ -36,7 +36,7 @@
 
 /// Is true if the class T has reflected its fields with TINT_REFLECT()
 template <typename T>
-static constexpr bool HasReflection = detail::HasReflection<T>::value;
+static constexpr bool HasReflection = tint::detail::HasReflection<T>::value;
 
 /// Calls @p callback with each field of @p object
 /// @param object the object
diff --git a/src/tint/resolver/address_space_layout_validation_test.cc b/src/tint/resolver/address_space_layout_validation_test.cc
index 9a621e3..1006120 100644
--- a/src/tint/resolver/address_space_layout_validation_test.cc
+++ b/src/tint/resolver/address_space_layout_validation_test.cc
@@ -17,11 +17,12 @@
 #include "gmock/gmock.h"
 #include "src/tint/resolver/resolver_test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using ResolverAddressSpaceLayoutValidationTest = ResolverTest;
 
 // Detect unaligned member for storage buffers
@@ -430,7 +431,7 @@
     // @group(0) @binding(0)
     // var<uniform> a : Outer;
 
-    Alias("Inner", ty.array(ty.vec2<f32>(), 10_u));
+    Alias("Inner", ty.array<vec2<f32>, 10>());
 
     Structure(Source{{12, 34}}, "Outer",
               utils::Vector{
@@ -739,7 +740,7 @@
 
     Structure(Source{{12, 34}}, "Outer",
               utils::Vector{
-                  Member("arr", ty.array(ty.vec3<f16>(), 10_u)),
+                  Member("arr", ty.array<vec3<f16>, 10>()),
               });
 
     GlobalVar(Source{{78, 90}}, "a", ty("Outer"), builtin::AddressSpace::kUniform, Group(0_a),
diff --git a/src/tint/resolver/address_space_validation_test.cc b/src/tint/resolver/address_space_validation_test.cc
index fae4a25..a5bd21e 100644
--- a/src/tint/resolver/address_space_validation_test.cc
+++ b/src/tint/resolver/address_space_validation_test.cc
@@ -18,11 +18,12 @@
 #include "src/tint/resolver/resolver_test_helper.h"
 #include "src/tint/sem/struct.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using ::testing::HasSubstr;
 
 using ResolverAddressSpaceValidationTest = ResolverTest;
@@ -67,8 +68,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_Private_RuntimeArray) {
     // type t : ptr<private, array<i32>>;
-    Alias("t", ty.ptr(Source{{56, 78}}, builtin::AddressSpace::kPrivate,
-                      ty.array(Source{{12, 34}}, ty.i32())));
+    Alias("t", ty.ptr<private_>(Source{{56, 78}}, ty.array(Source{{12, 34}}, ty.i32())));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
@@ -93,7 +93,7 @@
     // struct S { m : array<i32> };
     // type t = ptr<private, S>;
     Structure("S", utils::Vector{Member(Source{{12, 34}}, "m", ty.array(ty.i32()))});
-    Alias("t", ty.ptr(builtin::AddressSpace::kPrivate, ty("S")));
+    Alias("t", ty.ptr<private_>(ty("S")));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
@@ -115,7 +115,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_Workgroup_RuntimeArray) {
     // type t = ptr<workgroup, array<i32>>;
-    Alias("t", ty.ptr(builtin::AddressSpace::kWorkgroup, ty.array(Source{{12, 34}}, ty.i32())));
+    Alias("t", ty.ptr<workgroup>(ty.array(Source{{12, 34}}, ty.i32())));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
@@ -140,7 +140,7 @@
     // struct S { m : array<i32> };
     // type t = ptr<workgroup, S>;
     Structure("S", utils::Vector{Member(Source{{12, 34}}, "m", ty.array(ty.i32()))});
-    Alias(Source{{56, 78}}, "t", ty.ptr(builtin::AddressSpace::kWorkgroup, ty("S")));
+    Alias(Source{{56, 78}}, "t", ty.ptr<workgroup>(ty("S")));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
@@ -164,8 +164,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_Storage_Bool) {
     // type t = ptr<storage, bool>;
-    Alias(Source{{56, 78}}, "t",
-          ty.ptr(builtin::AddressSpace::kStorage, ty.bool_(Source{{12, 34}})));
+    Alias(Source{{56, 78}}, "t", ty.ptr<storage>(ty.bool_(Source{{12, 34}})));
 
     ASSERT_FALSE(r()->Resolve());
 
@@ -194,8 +193,7 @@
     // type a = bool;
     // type t = ptr<storage, a>;
     Alias("a", ty.bool_());
-    Alias(Source{{56, 78}}, "t",
-          ty.ptr(builtin::AddressSpace::kStorage, ty(Source{{12, 34}}, "a")));
+    Alias(Source{{56, 78}}, "t", ty.ptr<storage>(ty(Source{{12, 34}}, "a")));
 
     ASSERT_FALSE(r()->Resolve());
 
@@ -207,8 +205,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, GlobalVariable_Storage_Pointer) {
     // var<storage> g : ptr<private, f32>;
-    GlobalVar(Source{{56, 78}}, "g",
-              ty.ptr(Source{{12, 34}}, builtin::AddressSpace::kPrivate, ty.f32()),
+    GlobalVar(Source{{56, 78}}, "g", ty.ptr<private_, f32>(Source{{12, 34}}),
               builtin::AddressSpace::kStorage, Binding(0_a), Group(0_a));
 
     ASSERT_FALSE(r()->Resolve());
@@ -221,8 +218,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_Storage_Pointer) {
     // type t = ptr<storage, ptr<private, f32>>;
-    Alias("t", ty.ptr(Source{{56, 78}}, builtin::AddressSpace::kStorage,
-                      ty.ptr(Source{{12, 34}}, builtin::AddressSpace::kPrivate, ty.f32())));
+    Alias("t", ty.ptr<storage>(Source{{56, 78}}, ty.ptr<private_, f32>(Source{{12, 34}})));
 
     ASSERT_FALSE(r()->Resolve());
 
@@ -241,7 +237,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_Storage_IntScalar) {
     // type t = ptr<storage, i32;
-    Alias("t", ty.ptr(builtin::AddressSpace::kStorage, ty.i32()));
+    Alias("t", ty.ptr<storage, i32>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -261,7 +257,7 @@
     // type t = ptr<storage, f16>;
     Enable(builtin::Extension::kF16);
 
-    Alias("t", ty.ptr(builtin::AddressSpace::kStorage, ty.f16()));
+    Alias("t", ty.ptr<storage, f16>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -285,7 +281,7 @@
     Enable(builtin::Extension::kF16);
 
     Alias("a", ty.f16());
-    Alias("t", ty.ptr(builtin::AddressSpace::kStorage, ty("a")));
+    Alias("t", ty.ptr<storage>(ty("a")));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -299,7 +295,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_Storage_VectorF32) {
     // type t = ptr<storage, vec4<f32>>;
-    Alias("t", ty.ptr(builtin::AddressSpace::kStorage, ty.vec4<f32>()));
+    Alias("t", ty.ptr<storage, vec4<f32>>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -315,7 +311,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_Storage_VectorF16) {
     // type t = ptr<storage, vec4<f16>>;
     Enable(builtin::Extension::kF16);
-    Alias("t", ty.ptr(builtin::AddressSpace::kStorage, ty.vec(ty.f16(), 4u)));
+    Alias("t", ty.ptr<storage, vec4<f32>>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -334,7 +330,7 @@
     // struct S{ a : f32 };
     // type t = ptr<storage, array<S, 3u>>;
     Structure("S", utils::Vector{Member("a", ty.f32())});
-    Alias("t", ty.ptr(builtin::AddressSpace::kStorage, ty.array(ty("S"), 3_u)));
+    Alias("t", ty.ptr<storage>(ty.array(ty("S"), 3_u)));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -359,8 +355,7 @@
     Enable(builtin::Extension::kF16);
 
     Structure("S", utils::Vector{Member("a", ty.f16())});
-    Alias("t",
-          ty.ptr(builtin::AddressSpace::kStorage, ty.array(ty("S"), 3_u), builtin::Access::kRead));
+    Alias("t", ty.ptr<storage, read>(ty.array(ty("S"), 3_u)));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -379,7 +374,7 @@
     // struct S { x : i32 };
     // type t = ptr<storage, S, read>;
     Structure("S", utils::Vector{Member("x", ty.i32())});
-    Alias("t", ty.ptr(builtin::AddressSpace::kStorage, ty("S"), builtin::Access::kRead));
+    Alias("t", ty.ptr<storage, read>(ty("S")));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -404,7 +399,7 @@
     Structure("S", utils::Vector{Member("x", ty.i32())});
     Alias("a1", ty("S"));
     Alias("a2", ty("a1"));
-    Alias("t", ty.ptr(builtin::AddressSpace::kStorage, ty("a2"), builtin::Access::kRead));
+    Alias("t", ty.ptr<storage, read>(ty("a2")));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -427,7 +422,7 @@
     Enable(builtin::Extension::kF16);
 
     Structure("S", utils::Vector{Member("x", ty.f16())});
-    Alias("t", ty.ptr(builtin::AddressSpace::kStorage, ty("S"), builtin::Access::kRead));
+    Alias("t", ty.ptr<storage, read>(ty("S")));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -456,7 +451,7 @@
     Structure("S", utils::Vector{Member("x", ty.f16())});
     Alias("a1", ty("S"));
     Alias("a2", ty("a1"));
-    Alias("g", ty.ptr(builtin::AddressSpace::kStorage, ty("a2"), builtin::Access::kRead));
+    Alias("g", ty.ptr<storage, read>(ty("a2")));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -475,8 +470,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_NotStorage_AccessMode) {
     // type t = ptr<private, i32, read>;
-    Alias("t", ty.ptr(Source{{12, 34}}, builtin::AddressSpace::kPrivate, ty.i32(),
-                      builtin::Access::kRead));
+    Alias("t", ty.ptr<private_, i32, read>(Source{{12, 34}}));
 
     ASSERT_FALSE(r()->Resolve());
 
@@ -495,7 +489,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_Storage_ReadAccessMode) {
     // type t = ptr<storage, i32, read>;
-    Alias("t", ty.ptr(builtin::AddressSpace::kStorage, ty.i32(), builtin::Access::kRead));
+    Alias("t", ty.ptr<storage, i32, read>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -510,7 +504,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_Storage_ReadWriteAccessMode) {
     // type t = ptr<storage, i32, read_write>;
-    Alias("t", ty.ptr(builtin::AddressSpace::kStorage, ty.i32(), builtin::Access::kReadWrite));
+    Alias("t", ty.ptr<storage, i32, read_write>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -527,9 +521,8 @@
 }
 
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_Storage_WriteAccessMode) {
-    // type t = ptr<storage, i32, read_write>;
-    Alias("t", ty.ptr(Source{{12, 34}}, builtin::AddressSpace::kStorage, ty.i32(),
-                      builtin::Access::kWrite));
+    // type t = ptr<storage, i32, write>;
+    Alias("t", ty.ptr<storage, i32, write>(Source{{12, 34}}));
 
     ASSERT_FALSE(r()->Resolve());
 
@@ -561,7 +554,7 @@
     Structure("S",
               utils::Vector{Member(Source{{56, 78}}, "m", ty.array(Source{{12, 34}}, ty.i32()))});
 
-    Alias("t", ty.ptr(Source{{90, 12}}, builtin::AddressSpace::kUniform, ty("S")));
+    Alias("t", ty.ptr<uniform>(Source{{90, 12}}, ty("S")));
 
     ASSERT_FALSE(r()->Resolve());
     EXPECT_EQ(
@@ -589,8 +582,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_UniformBufferBool) {
     // type t = ptr<uniform, bool>;
-    Alias("t",
-          ty.ptr(Source{{56, 78}}, builtin::AddressSpace::kUniform, ty.bool_(Source{{12, 34}})));
+    Alias("t", ty.ptr<uniform>(Source{{56, 78}}, ty.bool_(Source{{12, 34}})));
 
     ASSERT_FALSE(r()->Resolve());
 
@@ -619,8 +611,7 @@
     // type a = bool;
     // type t = ptr<uniform, a>;
     Alias("a", ty.bool_());
-    Alias("t",
-          ty.ptr(Source{{56, 78}}, builtin::AddressSpace::kUniform, ty(Source{{12, 34}}, "a")));
+    Alias("t", ty.ptr<uniform>(Source{{56, 78}}, ty(Source{{12, 34}}, "a")));
 
     ASSERT_FALSE(r()->Resolve());
 
@@ -632,8 +623,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, GlobalVariable_UniformPointer) {
     // var<uniform> g : ptr<private, f32>;
-    GlobalVar(Source{{56, 78}}, "g",
-              ty.ptr(Source{{12, 34}}, builtin::AddressSpace::kPrivate, ty.f32()),
+    GlobalVar(Source{{56, 78}}, "g", ty.ptr<private_, f32>(Source{{12, 34}}),
               builtin::AddressSpace::kUniform, Binding(0_a), Group(0_a));
 
     ASSERT_FALSE(r()->Resolve());
@@ -646,8 +636,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_UniformPointer) {
     // type t = ptr<uniform, ptr<private, f32>>;
-    Alias("t", ty.ptr(Source{{56, 78}}, builtin::AddressSpace::kUniform,
-                      ty.ptr(Source{{12, 34}}, builtin::AddressSpace::kPrivate, ty.f32())));
+    Alias("t", ty.ptr<uniform>(Source{{56, 78}}, ty.ptr<private_, f32>(Source{{12, 34}})));
 
     ASSERT_FALSE(r()->Resolve());
 
@@ -667,7 +656,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_UniformBufferIntScalar) {
     // type t = ptr<uniform, i32>;
-    Alias("t", ty.ptr(builtin::AddressSpace::kUniform, ty.i32()));
+    Alias("t", ty.ptr<uniform, i32>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -687,7 +676,7 @@
     // type t = ptr<uniform, f16>;
     Enable(builtin::Extension::kF16);
 
-    Alias("t", ty.ptr(builtin::AddressSpace::kUniform, ty.f16()));
+    Alias("t", ty.ptr<uniform, f16>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -701,7 +690,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_UniformBufferVectorF32) {
     // type t = ptr<uniform, vec4<f32>>;
-    Alias("t", ty.ptr(builtin::AddressSpace::kUniform, ty.vec4<f32>()));
+    Alias("t", ty.ptr<uniform, vec4<f32>>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -721,7 +710,7 @@
     // type t = ptr<uniform, vec4<f16>>;
     Enable(builtin::Extension::kF16);
 
-    Alias("t", ty.ptr(builtin::AddressSpace::kUniform, ty.vec4<f16>()));
+    Alias("t", ty.ptr<uniform, f16>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -744,7 +733,7 @@
     // }
     // type t = ptr<uniform, array<S, 3u>>;
     Structure("S", utils::Vector{Member("a", ty.f32(), utils::Vector{MemberSize(16_a)})});
-    Alias("t", ty.ptr(builtin::AddressSpace::kUniform, ty.array(ty("S"), 3_u)));
+    Alias("t", ty.ptr<uniform>(ty.array(ty("S"), 3_u)));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -773,7 +762,7 @@
     Enable(builtin::Extension::kF16);
 
     Structure("S", utils::Vector{Member("a", ty.f16(), utils::Vector{MemberSize(16_a)})});
-    Alias("t", ty.ptr(builtin::AddressSpace::kUniform, ty.array(ty("S"), 3_u)));
+    Alias("t", ty.ptr<uniform>(ty.array(ty("S"), 3_u)));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -791,7 +780,7 @@
     // struct S { x : i32 };
     // type t = ptr<uniform, S>;
     Structure("S", utils::Vector{Member("x", ty.i32())});
-    Alias("t", ty.ptr(builtin::AddressSpace::kUniform, ty("S")));
+    Alias("t", ty.ptr<uniform>(ty("S")));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -813,7 +802,7 @@
     // type t = ptr<uniform, a1>;
     Structure("S", utils::Vector{Member("x", ty.i32())});
     Alias("a1", ty("S"));
-    Alias("t", ty.ptr(builtin::AddressSpace::kUniform, ty("a1")));
+    Alias("t", ty.ptr<uniform>(ty("a1")));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -837,7 +826,7 @@
     Enable(builtin::Extension::kF16);
 
     Structure("S", utils::Vector{Member("x", ty.f16())});
-    Alias("t", ty.ptr(builtin::AddressSpace::kUniform, ty("S")));
+    Alias("t", ty.ptr<uniform>(ty("S")));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -865,7 +854,7 @@
 
     Structure("S", utils::Vector{Member("x", ty.f16())});
     Alias("a1", ty("S"));
-    Alias("t", ty.ptr(builtin::AddressSpace::kUniform, ty("a1")));
+    Alias("t", ty.ptr<uniform>(ty("a1")));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -888,8 +877,7 @@
     // enable chromium_experimental_push_constant;
     // type t = ptr<push_constant, bool>;
     Enable(builtin::Extension::kChromiumExperimentalPushConstant);
-    Alias(Source{{56, 78}}, "t",
-          ty.ptr(builtin::AddressSpace::kPushConstant, ty.bool_(Source{{12, 34}})));
+    Alias(Source{{56, 78}}, "t", ty.ptr<push_constant>(ty.bool_(Source{{12, 34}})));
 
     ASSERT_FALSE(r()->Resolve());
     EXPECT_EQ(
@@ -917,7 +905,7 @@
     // type t = ptr<push_constant, f16>;
     Enable(builtin::Extension::kF16);
     Enable(builtin::Extension::kChromiumExperimentalPushConstant);
-    Alias("t", ty.ptr(builtin::AddressSpace::kPushConstant, ty.f16(Source{{56, 78}})));
+    Alias("t", ty.ptr<push_constant>(ty.f16(Source{{56, 78}})));
 
     ASSERT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
@@ -928,8 +916,7 @@
     // enable chromium_experimental_push_constant;
     // var<push_constant> g : ptr<private, f32>;
     Enable(builtin::Extension::kChromiumExperimentalPushConstant);
-    GlobalVar(Source{{56, 78}}, "g",
-              ty.ptr(Source{{12, 34}}, builtin::AddressSpace::kPrivate, ty.f32()),
+    GlobalVar(Source{{56, 78}}, "g", ty.ptr<private_, f32>(Source{{12, 34}}),
               builtin::AddressSpace::kPushConstant);
 
     ASSERT_FALSE(r()->Resolve());
@@ -943,9 +930,7 @@
     // enable chromium_experimental_push_constant;
     // type t = ptr<push_constant, ptr<private, f32>>;
     Enable(builtin::Extension::kChromiumExperimentalPushConstant);
-    Alias(Source{{56, 78}}, "t",
-          ty.ptr(builtin::AddressSpace::kPushConstant,
-                 ty.ptr(Source{{12, 34}}, builtin::AddressSpace::kPrivate, ty.f32())));
+    Alias(Source{{56, 78}}, "t", ty.ptr<push_constant>(ty.ptr<private_, f32>(Source{{12, 34}})));
 
     ASSERT_FALSE(r()->Resolve());
     EXPECT_EQ(
@@ -967,7 +952,7 @@
     // enable chromium_experimental_push_constant;
     // type t = ptr<push_constant, i32>;
     Enable(builtin::Extension::kChromiumExperimentalPushConstant);
-    Alias("t", ty.ptr(builtin::AddressSpace::kPushConstant, ty.i32()));
+    Alias("t", ty.ptr<push_constant, i32>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -985,7 +970,7 @@
     // enable chromium_experimental_push_constant;
     // var<push_constant> g : vec4<f32>;
     Enable(builtin::Extension::kChromiumExperimentalPushConstant);
-    Alias("t", ty.ptr(builtin::AddressSpace::kPushConstant, ty.vec4<f32>()));
+    Alias("t", ty.ptr<push_constant, vec4<f32>>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -1007,7 +992,7 @@
     // type t = ptr<push_constant, array<S, 3u>>;
     Enable(builtin::Extension::kChromiumExperimentalPushConstant);
     Structure("S", utils::Vector{Member("a", ty.f32())});
-    Alias("t", ty.ptr(builtin::AddressSpace::kPushConstant, ty.array(ty("S"), 3_u)));
+    Alias("t", ty.ptr<push_constant>(ty.array(ty("S"), 3_u)));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
diff --git a/src/tint/resolver/alias_analysis_test.cc b/src/tint/resolver/alias_analysis_test.cc
index 7eab9bc..21d8758 100644
--- a/src/tint/resolver/alias_analysis_test.cc
+++ b/src/tint/resolver/alias_analysis_test.cc
@@ -18,7 +18,8 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::resolver {
 namespace {
@@ -726,8 +727,8 @@
     Structure("S", utils::Vector{Member("a", ty.i32())});
     Func("f2",
          utils::Vector{
-             Param("p1", ty.ptr(builtin::AddressSpace::kFunction, ty("S"))),
-             Param("p2", ty.ptr(builtin::AddressSpace::kFunction, ty("S"))),
+             Param("p1", ty.ptr<function>(ty("S"))),
+             Param("p2", ty.ptr<function>(ty("S"))),
          },
          ty.void_(),
          utils::Vector{
@@ -755,8 +756,8 @@
     Structure("S", utils::Vector{Member("a", ty.i32())});
     Func("f2",
          utils::Vector{
-             Param("p1", ty.ptr(builtin::AddressSpace::kFunction, ty("S"))),
-             Param("p2", ty.ptr(builtin::AddressSpace::kFunction, ty("S"))),
+             Param("p1", ty.ptr<function>(ty("S"))),
+             Param("p2", ty.ptr<function>(ty("S"))),
          },
          ty.void_(),
          utils::Vector{
@@ -787,8 +788,8 @@
     Structure("S", utils::Vector{Member("a", ty.i32())});
     Func("f2",
          utils::Vector{
-             Param("p1", ty.ptr(builtin::AddressSpace::kFunction, ty("S"))),
-             Param("p2", ty.ptr(builtin::AddressSpace::kFunction, ty("S"))),
+             Param("p1", ty.ptr<function>(ty("S"))),
+             Param("p2", ty.ptr<function>(ty("S"))),
          },
          ty.void_(),
          utils::Vector{
@@ -818,13 +819,13 @@
     Structure("S", utils::Vector{Member("a", ty.i32())});
     Func("f2",
          utils::Vector{
-             Param("p1", ty.ptr(builtin::AddressSpace::kFunction, ty.vec4<f32>())),
-             Param("p2", ty.ptr(builtin::AddressSpace::kFunction, ty.vec4<f32>())),
+             Param("p1", ty.ptr<function, vec4<f32>>()),
+             Param("p2", ty.ptr<function, vec4<f32>>()),
          },
          ty.void_(),
          utils::Vector{
              Assign(Phony(), MemberAccessor(Deref("p2"), "zy")),
-             Assign(Deref("p1"), Call(ty.vec4<f32>())),
+             Assign(Deref("p1"), Call<vec4<f32>>()),
          });
     Func("f1", utils::Empty, ty.void_(),
          utils::Vector{
diff --git a/src/tint/resolver/array_accessor_test.cc b/src/tint/resolver/array_accessor_test.cc
index 118bcff..f9bc250 100644
--- a/src/tint/resolver/array_accessor_test.cc
+++ b/src/tint/resolver/array_accessor_test.cc
@@ -19,7 +19,8 @@
 #include "src/tint/sem/index_accessor_expression.h"
 #include "src/tint/type/reference.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::resolver {
 namespace {
@@ -65,7 +66,7 @@
 }
 
 TEST_F(ResolverIndexAccessorTest, Matrix_Dynamic) {
-    GlobalConst("my_const", ty.mat2x3<f32>(), Call(ty.mat2x3<f32>()));
+    GlobalConst("my_const", ty.mat2x3<f32>(), Call<mat2x3<f32>>());
     auto* idx = Var("idx", ty.i32(), Call<i32>());
     auto* acc = IndexAccessor("my_const", Expr(Source{{12, 34}}, idx));
     WrapInFunction(Decl(idx), acc);
@@ -80,7 +81,7 @@
 }
 
 TEST_F(ResolverIndexAccessorTest, Matrix_XDimension_Dynamic) {
-    GlobalConst("my_const", ty.mat4x4<f32>(), Call(ty.mat4x4<f32>()));
+    GlobalConst("my_const", ty.mat4x4<f32>(), Call<mat4x4<f32>>());
     auto* idx = Var("idx", ty.u32(), Expr(3_u));
     auto* acc = IndexAccessor("my_const", Expr(Source{{12, 34}}, idx));
     WrapInFunction(Decl(idx), acc);
@@ -90,7 +91,7 @@
 }
 
 TEST_F(ResolverIndexAccessorTest, Matrix_BothDimension_Dynamic) {
-    GlobalConst("my_const", ty.mat4x4<f32>(), Call(ty.mat4x4<f32>()));
+    GlobalConst("my_const", ty.mat4x4<f32>(), Call<mat4x4<f32>>());
     auto* idx = Var("idy", ty.u32(), Expr(2_u));
     auto* acc = IndexAccessor(IndexAccessor("my_const", Expr(Source{{12, 34}}, idx)), 1_i);
     WrapInFunction(Decl(idx), acc);
@@ -158,7 +159,7 @@
 }
 
 TEST_F(ResolverIndexAccessorTest, Vector_Dynamic) {
-    GlobalConst("my_const", ty.vec3<f32>(), Call(ty.vec3<f32>()));
+    GlobalConst("my_const", ty.vec3<f32>(), Call<vec3<f32>>());
     auto* idx = Var("idx", ty.i32(), Expr(2_i));
     auto* acc = IndexAccessor("my_const", Expr(Source{{12, 34}}, idx));
     WrapInFunction(Decl(idx), acc);
@@ -242,7 +243,7 @@
 }
 
 TEST_F(ResolverIndexAccessorTest, Array_Constant) {
-    GlobalConst("my_const", ty.array<f32, 3>(), array<f32, 3>());
+    GlobalConst("my_const", ty.array<f32, 3>(), Call<array<f32, 3>>());
 
     auto* acc = IndexAccessor("my_const", 2_i);
     WrapInFunction(acc);
@@ -257,7 +258,7 @@
     // let a : array<f32, 3> = 0;
     // var idx : i32 = 0;
     // var f : f32 = a[idx];
-    auto* a = Let("a", ty.array<f32, 3>(), array<f32, 3>());
+    auto* a = Let("a", ty.array<f32, 3>(), Call<array<f32, 3>>());
     auto* idx = Var("idx", ty.i32(), Call<i32>());
     auto* acc = IndexAccessor("a", Expr(Source{{12, 34}}, idx));
     auto* f = Var("f", ty.f32(), acc);
@@ -280,7 +281,7 @@
 TEST_F(ResolverIndexAccessorTest, Array_Literal_F32) {
     // let a : array<f32, 3>;
     // var f : f32 = a[2.0f];
-    auto* a = Let("a", ty.array<f32, 3>(), array<f32, 3>());
+    auto* a = Let("a", ty.array<f32, 3>(), Call<array<f32, 3>>());
     auto* f = Var("a_2", ty.f32(), IndexAccessor("a", Expr(Source{{12, 34}}, 2_f)));
     Func("my_func", utils::Empty, ty.void_(),
          utils::Vector{
@@ -294,7 +295,7 @@
 TEST_F(ResolverIndexAccessorTest, Array_Literal_I32) {
     // let a : array<f32, 3>;
     // var f : f32 = a[2i];
-    auto* a = Let("a", ty.array<f32, 3>(), array<f32, 3>());
+    auto* a = Let("a", ty.array<f32, 3>(), Call<array<f32, 3>>());
     auto* acc = IndexAccessor("a", 2_i);
     auto* f = Var("a_2", ty.f32(), acc);
     Func("my_func", utils::Empty, ty.void_(),
@@ -316,7 +317,7 @@
     //     let x: f32 = (*p)[idx];
     //     return x;
     // }
-    auto* p = Param("p", ty.ptr(builtin::AddressSpace::kFunction, ty.vec4<f32>()));
+    auto* p = Param("p", ty.ptr<function, vec4<f32>>());
     auto* idx = Let("idx", ty.u32(), Call<u32>());
     auto* star_p = Deref(p);
     auto* acc = IndexAccessor(Source{{12, 34}}, star_p, idx);
@@ -337,7 +338,7 @@
     //     let x: f32 = *p[idx];
     //     return x;
     // }
-    auto* p = Param("p", ty.ptr(builtin::AddressSpace::kFunction, ty.vec4<f32>()));
+    auto* p = Param("p", ty.ptr<function, vec4<f32>>());
     auto* idx = Let("idx", ty.u32(), Call<u32>());
     auto* accessor_expr = IndexAccessor(Source{{12, 34}}, p, idx);
     auto* star_p = Deref(accessor_expr);
diff --git a/src/tint/resolver/assignment_validation_test.cc b/src/tint/resolver/assignment_validation_test.cc
index bd4cd71..f1251cb 100644
--- a/src/tint/resolver/assignment_validation_test.cc
+++ b/src/tint/resolver/assignment_validation_test.cc
@@ -19,11 +19,12 @@
 #include "src/tint/type/storage_texture.h"
 #include "src/tint/type/texture_dimension.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using ResolverAssignmentValidationTest = ResolverTest;
 
 TEST_F(ResolverAssignmentValidationTest, ReadOnlyBuffer) {
@@ -182,9 +183,8 @@
     // var a : i32;
     // let b : ptr<function,i32> = &a;
     // *b = 2i;
-    const auto func = builtin::AddressSpace::kFunction;
-    WrapInFunction(Var("a", ty.i32(), func, Expr(2_i)),                //
-                   Let("b", ty.ptr<i32>(func), AddressOf(Expr("a"))),  //
+    WrapInFunction(Var("a", ty.i32(), builtin::AddressSpace::kFunction, Expr(2_i)),  //
+                   Let("b", ty.ptr<function, i32>(), AddressOf(Expr("a"))),          //
                    Assign(Deref("b"), 2_i));
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -194,9 +194,8 @@
     // var a : i32;
     // let b : ptr<function,i32> = &a;
     // *b = 2;
-    const auto func = builtin::AddressSpace::kFunction;
-    auto* var_a = Var("a", ty.i32(), func, Expr(2_i));
-    auto* var_b = Let("b", ty.ptr<i32>(func), AddressOf(Expr("a")));
+    auto* var_a = Var("a", ty.i32(), builtin::AddressSpace::kFunction, Expr(2_i));
+    auto* var_b = Let("b", ty.ptr<function, i32>(), AddressOf(Expr("a")));
     WrapInFunction(var_a, var_b, Assign(Deref("b"), 2_a));
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -433,9 +432,9 @@
                    Assign(Phony(), 3_f),                                    //
                    Assign(Phony(), 4_a),                                    //
                    Assign(Phony(), 5.0_a),                                  //
-                   Assign(Phony(), vec2<Infer>(6_a)),                       //
-                   Assign(Phony(), vec3<Infer>(7.0_a)),                     //
-                   Assign(Phony(), vec4<bool>()),                           //
+                   Assign(Phony(), Call<vec2<Infer>>(6_a)),                 //
+                   Assign(Phony(), Call<vec3<Infer>>(7.0_a)),               //
+                   Assign(Phony(), Call<vec4<bool>>()),                     //
                    Assign(Phony(), "tex"),                                  //
                    Assign(Phony(), "smp"),                                  //
                    Assign(Phony(), AddressOf("s")),                         //
diff --git a/src/tint/resolver/attribute_validation_test.cc b/src/tint/resolver/attribute_validation_test.cc
index 97af866..741641e 100644
--- a/src/tint/resolver/attribute_validation_test.cc
+++ b/src/tint/resolver/attribute_validation_test.cc
@@ -22,25 +22,14 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::resolver {
 
 // Helpers and typedefs
 template <typename T>
 using DataType = builder::DataType<T>;
-template <typename T>
-using vec2 = builder::vec2<T>;
-template <typename T>
-using vec3 = builder::vec3<T>;
-template <typename T>
-using vec4 = builder::vec4<T>;
-template <typename T>
-using mat2x2 = builder::mat2x2<T>;
-template <typename T>
-using mat3x3 = builder::mat3x3<T>;
-template <typename T>
-using mat4x4 = builder::mat4x4<T>;
 template <typename T, int ID = 0>
 using alias = builder::alias<T, ID>;
 template <typename T>
@@ -353,7 +342,7 @@
     auto* p = Param("a", ty.vec4<f32>(), attrs);
     Func("vertex_main", utils::Vector{p}, ty.vec4<f32>(),
          utils::Vector{
-             Return(Call(ty.vec4<f32>())),
+             Return(Call<vec4<f32>>()),
          },
          utils::Vector{
              Stage(ast::PipelineStage::kVertex),
@@ -404,7 +393,7 @@
     auto& params = GetParam();
     Func("main", utils::Empty, ty.vec4<f32>(),
          utils::Vector{
-             Return(Call(ty.vec4<f32>(), 1_f)),
+             Return(Call<vec4<f32>>(1_f)),
          },
          utils::Vector{
              Stage(ast::PipelineStage::kCompute),
@@ -456,7 +445,7 @@
     auto& params = GetParam();
     auto attrs = createAttributes(Source{{12, 34}}, *this, params.kind);
     attrs.Push(Location(Source{{34, 56}}, 2_a));
-    Func("frag_main", utils::Empty, ty.vec4<f32>(), utils::Vector{Return(Call(ty.vec4<f32>()))},
+    Func("frag_main", utils::Empty, ty.vec4<f32>(), utils::Vector{Return(Call<vec4<f32>>())},
          utils::Vector{
              Stage(ast::PipelineStage::kFragment),
          },
@@ -513,7 +502,7 @@
     }
     Func("vertex_main", utils::Empty, ty.vec4<f32>(),
          utils::Vector{
-             Return(Call(ty.vec4<f32>())),
+             Return(Call<vec4<f32>>()),
          },
          utils::Vector{
              Stage(ast::PipelineStage::kVertex),
@@ -1602,8 +1591,10 @@
 
     Func("F", utils::Empty, ty.void_(),
          utils::Vector{
-             Decl(Var("a", ty.vec4<f32>(), Call("textureLoad", "A", vec2<i32>(1_i, 2_i), 0_i))),
-             Decl(Var("b", ty.vec4<f32>(), Call("textureLoad", "B", vec2<i32>(1_i, 2_i), 0_i))),
+             Decl(Var("a", ty.vec4<f32>(),
+                      Call("textureLoad", "A", Call<vec2<i32>>(1_i, 2_i), 0_i))),
+             Decl(Var("b", ty.vec4<f32>(),
+                      Call("textureLoad", "B", Call<vec2<i32>>(1_i, 2_i), 0_i))),
          },
          utils::Vector{
              Stage(ast::PipelineStage::kFragment),
@@ -1624,14 +1615,16 @@
 
     Func("F_A", utils::Empty, ty.void_(),
          utils::Vector{
-             Decl(Var("a", ty.vec4<f32>(), Call("textureLoad", "A", vec2<i32>(1_i, 2_i), 0_i))),
+             Decl(Var("a", ty.vec4<f32>(),
+                      Call("textureLoad", "A", Call<vec2<i32>>(1_i, 2_i), 0_i))),
          },
          utils::Vector{
              Stage(ast::PipelineStage::kFragment),
          });
     Func("F_B", utils::Empty, ty.void_(),
          utils::Vector{
-             Decl(Var("b", ty.vec4<f32>(), Call("textureLoad", "B", vec2<i32>(1_i, 2_i), 0_i))),
+             Decl(Var("b", ty.vec4<f32>(),
+                      Call("textureLoad", "B", Call<vec2<i32>>(1_i, 2_i), 0_i))),
          },
          utils::Vector{
              Stage(ast::PipelineStage::kFragment),
@@ -1663,7 +1656,7 @@
                         });
     Func("main", utils::Vector{param}, ty.vec4<f32>(),
          utils::Vector{
-             Return(Call(ty.vec4<f32>())),
+             Return(Call<vec4<f32>>()),
          },
          utils::Vector{
              Stage(ast::PipelineStage::kFragment),
@@ -1682,7 +1675,7 @@
                         });
     Func("main", utils::Vector{param}, ty.vec4<f32>(),
          utils::Vector{
-             Return(Call(ty.vec4<f32>())),
+             Return(Call<vec4<f32>>()),
          },
          utils::Vector{
              Stage(ast::PipelineStage::kFragment),
@@ -1705,7 +1698,7 @@
 TEST_F(MustUseAttributeTests, MustUse) {
     Func("main", utils::Empty, ty.vec4<f32>(),
          utils::Vector{
-             Return(Call(ty.vec4<f32>())),
+             Return(Call<vec4<f32>>()),
          },
          utils::Vector{
              MustUse(Source{{12, 34}}),
@@ -1964,7 +1957,7 @@
 TEST_F(InterpolateTest, MissingLocationAttribute_ReturnType) {
     Func("main", utils::Empty, ty.vec4<f32>(),
          utils::Vector{
-             Return(Call(ty.vec4<f32>())),
+             Return(Call<vec4<f32>>()),
          },
          utils::Vector{
              Stage(ast::PipelineStage::kVertex),
diff --git a/src/tint/resolver/bitcast_validation_test.cc b/src/tint/resolver/bitcast_validation_test.cc
index fb0b960..c979c55 100644
--- a/src/tint/resolver/bitcast_validation_test.cc
+++ b/src/tint/resolver/bitcast_validation_test.cc
@@ -21,6 +21,8 @@
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+
 struct Type {
     template <typename T>
     static constexpr Type Create() {
@@ -39,36 +41,36 @@
     Type::Create<u32>(),
 };
 static constexpr Type kVec2NumericScalars[] = {
-    Type::Create<builder::vec2<f32>>(),
-    Type::Create<builder::vec2<i32>>(),
-    Type::Create<builder::vec2<u32>>(),
+    Type::Create<vec2<f32>>(),
+    Type::Create<vec2<i32>>(),
+    Type::Create<vec2<u32>>(),
 };
 static constexpr Type kVec3NumericScalars[] = {
-    Type::Create<builder::vec3<f32>>(),
-    Type::Create<builder::vec3<i32>>(),
-    Type::Create<builder::vec3<u32>>(),
+    Type::Create<vec3<f32>>(),
+    Type::Create<vec3<i32>>(),
+    Type::Create<vec3<u32>>(),
 };
 static constexpr Type kVec4NumericScalars[] = {
-    Type::Create<builder::vec4<f32>>(),
-    Type::Create<builder::vec4<i32>>(),
-    Type::Create<builder::vec4<u32>>(),
+    Type::Create<vec4<f32>>(),
+    Type::Create<vec4<i32>>(),
+    Type::Create<vec4<u32>>(),
 };
 static constexpr Type kInvalid[] = {
     // A non-exhaustive selection of uncastable types
     Type::Create<bool>(),
-    Type::Create<builder::vec2<bool>>(),
-    Type::Create<builder::vec3<bool>>(),
-    Type::Create<builder::vec4<bool>>(),
-    Type::Create<builder::array<2, i32>>(),
-    Type::Create<builder::array<3, u32>>(),
-    Type::Create<builder::array<4, f32>>(),
-    Type::Create<builder::array<5, bool>>(),
-    Type::Create<builder::mat2x2<f32>>(),
-    Type::Create<builder::mat3x3<f32>>(),
-    Type::Create<builder::mat4x4<f32>>(),
-    Type::Create<builder::ptr<i32>>(),
-    Type::Create<builder::ptr<builder::array<2, i32>>>(),
-    Type::Create<builder::ptr<builder::mat2x2<f32>>>(),
+    Type::Create<vec2<bool>>(),
+    Type::Create<vec3<bool>>(),
+    Type::Create<vec4<bool>>(),
+    Type::Create<array<i32, 2>>(),
+    Type::Create<array<u32, 3>>(),
+    Type::Create<array<f32, 4>>(),
+    Type::Create<array<bool, 5>>(),
+    Type::Create<mat2x2<f32>>(),
+    Type::Create<mat3x3<f32>>(),
+    Type::Create<mat4x4<f32>>(),
+    Type::Create<ptr<private_, i32>>(),
+    Type::Create<ptr<private_, array<i32, 2>>>(),
+    Type::Create<ptr<private_, mat2x2<f32>>>(),
 };
 
 using ResolverBitcastValidationTest = ResolverTestWithParam<std::tuple<Type, Type>>;
diff --git a/src/tint/resolver/builtin_test.cc b/src/tint/resolver/builtin_test.cc
index 5a23354..5d23b39 100644
--- a/src/tint/resolver/builtin_test.cc
+++ b/src/tint/resolver/builtin_test.cc
@@ -43,7 +43,8 @@
 using ::testing::ElementsAre;
 using ::testing::HasSubstr;
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::resolver {
 namespace {
@@ -156,8 +157,9 @@
 }
 
 TEST_F(ResolverBuiltinTest, Select_Error_Matrix) {
-    auto* expr = Call("select", mat2x2<f32>(vec2<f32>(1_f, 1_f), vec2<f32>(1_f, 1_f)),
-                      mat2x2<f32>(vec2<f32>(1_f, 1_f), vec2<f32>(1_f, 1_f)), Expr(true));
+    auto* expr =
+        Call("select", Call<mat2x2<f32>>(Call<vec2<f32>>(1_f, 1_f), Call<vec2<f32>>(1_f, 1_f)),
+             Call<mat2x2<f32>>(Call<vec2<f32>>(1_f, 1_f), Call<vec2<f32>>(1_f, 1_f)), Expr(true));
     WrapInFunction(expr);
 
     EXPECT_FALSE(r()->Resolve());
@@ -173,7 +175,7 @@
 }
 
 TEST_F(ResolverBuiltinTest, Select_Error_MismatchTypes) {
-    auto* expr = Call("select", 1_f, vec2<f32>(2_f, 3_f), Expr(true));
+    auto* expr = Call("select", 1_f, Call<vec2<f32>>(2_f, 3_f), Expr(true));
     WrapInFunction(expr);
 
     EXPECT_FALSE(r()->Resolve());
@@ -189,7 +191,7 @@
 }
 
 TEST_F(ResolverBuiltinTest, Select_Error_MismatchVectorSize) {
-    auto* expr = Call("select", vec2<f32>(1_f, 2_f), vec3<f32>(3_f, 4_f, 5_f), Expr(true));
+    auto* expr = Call("select", Call<vec2<f32>>(1_f, 2_f), Call<vec3<f32>>(3_f, 4_f, 5_f), true);
     WrapInFunction(expr);
 
     EXPECT_FALSE(r()->Resolve());
@@ -304,8 +306,8 @@
 TEST_P(ResolverBuiltinTest_FloatBuiltin_IdenticalType, OneParam_Vector_f32) {
     auto param = GetParam();
 
-    auto val = param.name == std::string("acosh") ? vec3<f32>(1.0_f, 2.0_f, 3.0_f)
-                                                  : vec3<f32>(0.5_f, 0.5_f, 0.8_f);
+    auto val = param.name == std::string("acosh") ? Call<vec3<f32>>(1.0_f, 2.0_f, 3.0_f)
+                                                  : Call<vec3<f32>>(0.5_f, 0.5_f, 0.8_f);
 
     auto* call = Call(param.name, val);
     WrapInFunction(call);
@@ -352,7 +354,7 @@
 TEST_P(ResolverBuiltinTest_FloatBuiltin_IdenticalType, TwoParams_Vector_f32) {
     auto param = GetParam();
 
-    auto* call = Call(param.name, vec3<f32>(1_f, 1_f, 3_f), vec3<f32>(1_f, 1_f, 3_f));
+    auto* call = Call(param.name, Call<vec3<f32>>(1_f, 1_f, 3_f), Call<vec3<f32>>(1_f, 1_f, 3_f));
     WrapInFunction(call);
 
     if (param.args_number == 2u) {
@@ -397,8 +399,8 @@
 TEST_P(ResolverBuiltinTest_FloatBuiltin_IdenticalType, ThreeParams_Vector_f32) {
     auto param = GetParam();
 
-    auto* call = Call(param.name, vec3<f32>(0_f, 0_f, 0_f), vec3<f32>(1_f, 1_f, 1_f),
-                      vec3<f32>(2_f, 2_f, 2_f));
+    auto* call = Call(param.name, Call<vec3<f32>>(0_f, 0_f, 0_f), Call<vec3<f32>>(1_f, 1_f, 1_f),
+                      Call<vec3<f32>>(2_f, 2_f, 2_f));
     WrapInFunction(call);
 
     if (param.args_number == 3u) {
@@ -444,8 +446,8 @@
 TEST_P(ResolverBuiltinTest_FloatBuiltin_IdenticalType, FourParams_Vector_f32) {
     auto param = GetParam();
 
-    auto* call = Call(param.name, vec3<f32>(1_f, 1_f, 3_f), vec3<f32>(1_f, 1_f, 3_f),
-                      vec3<f32>(1_f, 1_f, 3_f), vec3<f32>(1_f, 1_f, 3_f));
+    auto* call = Call(param.name, Call<vec3<f32>>(1_f, 1_f, 3_f), Call<vec3<f32>>(1_f, 1_f, 3_f),
+                      Call<vec3<f32>>(1_f, 1_f, 3_f), Call<vec3<f32>>(1_f, 1_f, 3_f));
     WrapInFunction(call);
 
     if (param.args_number == 4u) {
@@ -500,8 +502,8 @@
 
     Enable(builtin::Extension::kF16);
 
-    auto val = param.name == std::string("acosh") ? vec3<f16>(1.0_h, 2.0_h, 3.0_h)
-                                                  : vec3<f16>(0.5_h, 0.5_h, 0.8_h);
+    auto val = param.name == std::string("acosh") ? Call<vec3<f16>>(1.0_h, 2.0_h, 3.0_h)
+                                                  : Call<vec3<f16>>(0.5_h, 0.5_h, 0.8_h);
 
     auto* call = Call(param.name, val);
     WrapInFunction(call);
@@ -552,7 +554,7 @@
 
     Enable(builtin::Extension::kF16);
 
-    auto* call = Call(param.name, vec3<f16>(1_h, 1_h, 3_h), vec3<f16>(1_h, 1_h, 3_h));
+    auto* call = Call(param.name, Call<vec3<f16>>(1_h, 1_h, 3_h), Call<vec3<f16>>(1_h, 1_h, 3_h));
     WrapInFunction(call);
 
     if (param.args_number == 2u) {
@@ -601,8 +603,8 @@
 
     Enable(builtin::Extension::kF16);
 
-    auto* call = Call(param.name, vec3<f16>(0_h, 0_h, 0_h), vec3<f16>(1_h, 1_h, 1_h),
-                      vec3<f16>(2_h, 2_h, 2_h));
+    auto* call = Call(param.name, Call<vec3<f16>>(0_h, 0_h, 0_h), Call<vec3<f16>>(1_h, 1_h, 1_h),
+                      Call<vec3<f16>>(2_h, 2_h, 2_h));
     WrapInFunction(call);
 
     if (param.args_number == 3u) {
@@ -652,8 +654,8 @@
 
     Enable(builtin::Extension::kF16);
 
-    auto* call = Call(param.name, vec3<f16>(1_h, 1_h, 3_h), vec3<f16>(1_h, 1_h, 3_h),
-                      vec3<f16>(1_h, 1_h, 3_h), vec3<f16>(1_h, 1_h, 3_h));
+    auto* call = Call(param.name, Call<vec3<f16>>(1_h, 1_h, 3_h), Call<vec3<f16>>(1_h, 1_h, 3_h),
+                      Call<vec3<f16>>(1_h, 1_h, 3_h), Call<vec3<f16>>(1_h, 1_h, 3_h));
     WrapInFunction(call);
 
     if (param.args_number == 4u) {
@@ -732,7 +734,7 @@
 
 // cross: (vec3<T>, vec3<T>) -> vec3<T>
 TEST_F(ResolverBuiltinFloatTest, Cross_f32) {
-    auto* call = Call("cross", vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(1_f, 2_f, 3_f));
+    auto* call = Call("cross", Call<vec3<f32>>(1_f, 2_f, 3_f), Call<vec3<f32>>(1_f, 2_f, 3_f));
     WrapInFunction(call);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -746,7 +748,7 @@
 TEST_F(ResolverBuiltinFloatTest, Cross_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* call = Call("cross", vec3<f16>(1_h, 2_h, 3_h), vec3<f16>(1_h, 2_h, 3_h));
+    auto* call = Call("cross", Call<vec3<f16>>(1_h, 2_h, 3_h), Call<vec3<f16>>(1_h, 2_h, 3_h));
     WrapInFunction(call);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -784,7 +786,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, Cross_Error_Vec3Int) {
-    auto* call = Call("cross", vec3<i32>(1_i, 2_i, 3_i), vec3<i32>(1_i, 2_i, 3_i));
+    auto* call = Call("cross", Call<vec3<i32>>(1_i, 2_i, 3_i), Call<vec3<i32>>(1_i, 2_i, 3_i));
     WrapInFunction(call);
 
     EXPECT_FALSE(r()->Resolve());
@@ -798,7 +800,8 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, Cross_Error_Vec4) {
-    auto* call = Call("cross", vec4<f32>(1_f, 2_f, 3_f, 4_f), vec4<f32>(1_f, 2_f, 3_f, 4_f));
+    auto* call =
+        Call("cross", Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f), Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f));
 
     WrapInFunction(call);
 
@@ -813,8 +816,8 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, Cross_Error_TooManyParams) {
-    auto* call =
-        Call("cross", vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(1_f, 2_f, 3_f));
+    auto* call = Call("cross", Call<vec3<f32>>(1_f, 2_f, 3_f), Call<vec3<f32>>(1_f, 2_f, 3_f),
+                      Call<vec3<f32>>(1_f, 2_f, 3_f));
 
     WrapInFunction(call);
 
@@ -852,7 +855,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, Distance_Vector_f32) {
-    auto* call = Call("distance", vec3<f32>(1_f, 1_f, 3_f), vec3<f32>(1_f, 1_f, 3_f));
+    auto* call = Call("distance", Call<vec3<f32>>(1_f, 1_f, 3_f), Call<vec3<f32>>(1_f, 1_f, 3_f));
     WrapInFunction(call);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -864,7 +867,7 @@
 TEST_F(ResolverBuiltinFloatTest, Distance_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* call = Call("distance", vec3<f16>(1_h, 1_h, 3_h), vec3<f16>(1_h, 1_h, 3_h));
+    auto* call = Call("distance", Call<vec3<f16>>(1_h, 1_h, 3_h), Call<vec3<f16>>(1_h, 1_h, 3_h));
     WrapInFunction(call);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -874,8 +877,8 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, Distance_TooManyParams) {
-    auto* call = Call("distance", vec3<f32>(1_f, 1_f, 3_f), vec3<f32>(1_f, 1_f, 3_f),
-                      vec3<f32>(1_f, 1_f, 3_f));
+    auto* call = Call("distance", Call<vec3<f32>>(1_f, 1_f, 3_f), Call<vec3<f32>>(1_f, 1_f, 3_f),
+                      Call<vec3<f32>>(1_f, 1_f, 3_f));
     WrapInFunction(call);
 
     EXPECT_FALSE(r()->Resolve());
@@ -889,7 +892,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, Distance_TooFewParams) {
-    auto* call = Call("distance", vec3<f32>(1_f, 1_f, 3_f));
+    auto* call = Call("distance", Call<vec3<f32>>(1_f, 1_f, 3_f));
     WrapInFunction(call);
 
     EXPECT_FALSE(r()->Resolve());
@@ -979,7 +982,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, FrexpVector_f32) {
-    auto* call = Call("frexp", vec3<f32>());
+    auto* call = Call("frexp", Call<vec3<f32>>());
     WrapInFunction(call);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1014,7 +1017,7 @@
 TEST_F(ResolverBuiltinFloatTest, FrexpVector_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* call = Call("frexp", vec3<f16>());
+    auto* call = Call("frexp", Call<vec3<f16>>());
     WrapInFunction(call);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1086,7 +1089,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, Length_FloatVector_f32) {
-    auto* call = Call("length", vec3<f32>(1_f, 1_f, 3_f));
+    auto* call = Call("length", Call<vec3<f32>>(1_f, 1_f, 3_f));
     WrapInFunction(call);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1098,7 +1101,7 @@
 TEST_F(ResolverBuiltinFloatTest, Length_FloatVector_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* call = Call("length", vec3<f16>(1_h, 1_h, 3_h));
+    auto* call = Call("length", Call<vec3<f16>>(1_h, 1_h, 3_h));
     WrapInFunction(call);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1138,7 +1141,7 @@
 // mix(vecN<T>, vecN<T>, T) -> vecN<T>. Other overloads are tested in
 // ResolverBuiltinTest_FloatBuiltin_IdenticalType above.
 TEST_F(ResolverBuiltinFloatTest, Mix_VectorScalar_f32) {
-    auto* call = Call("mix", vec3<f32>(1_f, 1_f, 3_f), vec3<f32>(1_f, 1_f, 3_f), 4_f);
+    auto* call = Call("mix", Call<vec3<f32>>(1_f, 1_f, 3_f), Call<vec3<f32>>(1_f, 1_f, 3_f), 4_f);
     WrapInFunction(call);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1153,7 +1156,7 @@
 TEST_F(ResolverBuiltinFloatTest, Mix_VectorScalar_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* call = Call("mix", vec3<f16>(1_h, 1_h, 1_h), vec3<f16>(1_h, 1_h, 1_h), 4_h);
+    auto* call = Call("mix", Call<vec3<f16>>(1_h, 1_h, 1_h), Call<vec3<f16>>(1_h, 1_h, 1_h), 4_h);
     WrapInFunction(call);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1228,7 +1231,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, ModfVector_f32) {
-    auto* call = Call("modf", vec3<f32>());
+    auto* call = Call("modf", Call<vec3<f32>>());
     WrapInFunction(call);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1263,7 +1266,7 @@
 TEST_F(ResolverBuiltinFloatTest, ModfVector_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* call = Call("modf", vec3<f16>());
+    auto* call = Call("modf", Call<vec3<f16>>());
     WrapInFunction(call);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1343,7 +1346,7 @@
 
 TEST_F(ResolverBuiltinFloatTest, Modf_Error_VectorSizesDontMatch) {
     GlobalVar("whole", ty.vec4<f32>(), builtin::AddressSpace::kWorkgroup);
-    auto* call = Call("modf", vec2<f32>(1_f, 2_f), AddressOf("whole"));
+    auto* call = Call("modf", Call<vec2<f32>>(1_f, 2_f), AddressOf("whole"));
     WrapInFunction(call);
 
     EXPECT_FALSE(r()->Resolve());
@@ -1359,7 +1362,7 @@
 
 // normalize: (vecN<T>) -> vecN<T>
 TEST_F(ResolverBuiltinFloatTest, Normalize_Vector_f32) {
-    auto* call = Call("normalize", vec3<f32>(1_f, 1_f, 3_f));
+    auto* call = Call("normalize", Call<vec3<f32>>(1_f, 1_f, 3_f));
     WrapInFunction(call);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1373,7 +1376,7 @@
 TEST_F(ResolverBuiltinFloatTest, Normalize_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* call = Call("normalize", vec3<f16>(1_h, 1_h, 3_h));
+    auto* call = Call("normalize", Call<vec3<f16>>(1_h, 1_h, 3_h));
     WrapInFunction(call);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1455,7 +1458,7 @@
 TEST_P(ResolverBuiltinTest_IntegerBuiltin_IdenticalType, OneParams_Vector_i32) {
     auto param = GetParam();
 
-    auto* call = Call(param.name, vec3<i32>(1_i, 1_i, 3_i));
+    auto* call = Call(param.name, Call<vec3<i32>>(1_i, 1_i, 3_i));
     WrapInFunction(call);
 
     if (param.args_number == 1u) {
@@ -1500,7 +1503,7 @@
 TEST_P(ResolverBuiltinTest_IntegerBuiltin_IdenticalType, OneParams_Vector_u32) {
     auto param = GetParam();
 
-    auto* call = Call(param.name, vec3<u32>(1_u, 1_u, 3_u));
+    auto* call = Call(param.name, Call<vec3<u32>>(1_u, 1_u, 3_u));
     WrapInFunction(call);
 
     if (param.args_number == 1u) {
@@ -1545,7 +1548,7 @@
 TEST_P(ResolverBuiltinTest_IntegerBuiltin_IdenticalType, TwoParams_Vector_i32) {
     auto param = GetParam();
 
-    auto* call = Call(param.name, vec3<i32>(1_i, 1_i, 3_i), vec3<i32>(1_i, 1_i, 3_i));
+    auto* call = Call(param.name, Call<vec3<i32>>(1_i, 1_i, 3_i), Call<vec3<i32>>(1_i, 1_i, 3_i));
     WrapInFunction(call);
 
     if (param.args_number == 2u) {
@@ -1590,7 +1593,7 @@
 TEST_P(ResolverBuiltinTest_IntegerBuiltin_IdenticalType, TwoParams_Vector_u32) {
     auto param = GetParam();
 
-    auto* call = Call(param.name, vec3<u32>(1_u, 1_u, 3_u), vec3<u32>(1_u, 1_u, 3_u));
+    auto* call = Call(param.name, Call<vec3<u32>>(1_u, 1_u, 3_u), Call<vec3<u32>>(1_u, 1_u, 3_u));
     WrapInFunction(call);
 
     if (param.args_number == 2u) {
@@ -1635,8 +1638,8 @@
 TEST_P(ResolverBuiltinTest_IntegerBuiltin_IdenticalType, ThreeParams_Vector_i32) {
     auto param = GetParam();
 
-    auto* call = Call(param.name, vec3<i32>(1_i, 1_i, 3_i), vec3<i32>(1_i, 1_i, 3_i),
-                      vec3<i32>(1_i, 1_i, 3_i));
+    auto* call = Call(param.name, Call<vec3<i32>>(1_i, 1_i, 3_i), Call<vec3<i32>>(1_i, 1_i, 3_i),
+                      Call<vec3<i32>>(1_i, 1_i, 3_i));
     WrapInFunction(call);
 
     if (param.args_number == 3u) {
@@ -1682,8 +1685,8 @@
 TEST_P(ResolverBuiltinTest_IntegerBuiltin_IdenticalType, ThreeParams_Vector_u32) {
     auto param = GetParam();
 
-    auto* call = Call(param.name, vec3<u32>(1_u, 1_u, 3_u), vec3<u32>(1_u, 1_u, 3_u),
-                      vec3<u32>(1_u, 1_u, 3_u));
+    auto* call = Call(param.name, Call<vec3<u32>>(1_u, 1_u, 3_u), Call<vec3<u32>>(1_u, 1_u, 3_u),
+                      Call<vec3<u32>>(1_u, 1_u, 3_u));
     WrapInFunction(call);
 
     if (param.args_number == 3u) {
@@ -1729,8 +1732,8 @@
 TEST_P(ResolverBuiltinTest_IntegerBuiltin_IdenticalType, FourParams_Vector_i32) {
     auto param = GetParam();
 
-    auto* call = Call(param.name, vec3<i32>(1_i, 1_i, 3_i), vec3<i32>(1_i, 1_i, 3_i),
-                      vec3<i32>(1_i, 1_i, 3_i), vec3<i32>(1_i, 1_i, 3_i));
+    auto* call = Call(param.name, Call<vec3<i32>>(1_i, 1_i, 3_i), Call<vec3<i32>>(1_i, 1_i, 3_i),
+                      Call<vec3<i32>>(1_i, 1_i, 3_i), Call<vec3<i32>>(1_i, 1_i, 3_i));
     WrapInFunction(call);
 
     if (param.args_number == 4u) {
@@ -1776,8 +1779,8 @@
 TEST_P(ResolverBuiltinTest_IntegerBuiltin_IdenticalType, FourParams_Vector_u32) {
     auto param = GetParam();
 
-    auto* call = Call(param.name, vec3<u32>(1_u, 1_u, 3_u), vec3<u32>(1_u, 1_u, 3_u),
-                      vec3<u32>(1_u, 1_u, 3_u), vec3<u32>(1_u, 1_u, 3_u));
+    auto* call = Call(param.name, Call<vec3<u32>>(1_u, 1_u, 3_u), Call<vec3<u32>>(1_u, 1_u, 3_u),
+                      Call<vec3<u32>>(1_u, 1_u, 3_u), Call<vec3<u32>>(1_u, 1_u, 3_u));
     WrapInFunction(call);
 
     if (param.args_number == 4u) {
@@ -2188,10 +2191,9 @@
                          ResolverBuiltinTest_Texture,
                          testing::ValuesIn(ast::test::TextureOverloadCase::ValidCases()));
 
-static std::string to_str(const std::string& function,
-                          utils::VectorRef<const sem::Parameter*> params) {
+static std::string to_str(const std::string& func, utils::VectorRef<const sem::Parameter*> params) {
     utils::StringStream out;
-    out << function << "(";
+    out << func << "(";
     bool first = true;
     for (auto* param : params) {
         if (!first) {
@@ -2556,8 +2558,8 @@
     bool pack4 = param.builtin == builtin::Function::kPack4X8Snorm ||
                  param.builtin == builtin::Function::kPack4X8Unorm;
 
-    auto* call = pack4 ? Call(param.name, vec4<f32>(1_f, 2_f, 3_f, 4_f))
-                       : Call(param.name, vec2<f32>(1_f, 2_f));
+    auto* call = pack4 ? Call(param.name, Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f))
+                       : Call(param.name, Call<vec2<f32>>(1_f, 2_f));
     WrapInFunction(call);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -2571,8 +2573,8 @@
     bool pack4 = param.builtin == builtin::Function::kPack4X8Snorm ||
                  param.builtin == builtin::Function::kPack4X8Unorm;
 
-    auto* call = pack4 ? Call(param.name, vec4<i32>(1_i, 2_i, 3_i, 4_i))
-                       : Call(param.name, vec2<i32>(1_i, 2_i));
+    auto* call = pack4 ? Call(param.name, Call<vec4<i32>>(1_i, 2_i, 3_i, 4_i))
+                       : Call(param.name, Call<vec2<i32>>(1_i, 2_i));
     WrapInFunction(call);
 
     EXPECT_FALSE(r()->Resolve());
@@ -2597,8 +2599,8 @@
     bool pack4 = param.builtin == builtin::Function::kPack4X8Snorm ||
                  param.builtin == builtin::Function::kPack4X8Unorm;
 
-    auto* call = pack4 ? Call(param.name, vec4<f32>(1_f, 2_f, 3_f, 4_f), 1_f)
-                       : Call(param.name, vec2<f32>(1_f, 2_f), 1_f);
+    auto* call = pack4 ? Call(param.name, Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f), 1_f)
+                       : Call(param.name, Call<vec2<f32>>(1_f, 2_f), 1_f);
     WrapInFunction(call);
 
     EXPECT_FALSE(r()->Resolve());
@@ -2669,7 +2671,7 @@
 TEST_P(ResolverBuiltinTest_Barrier, Error_TooManyParams) {
     auto param = GetParam();
 
-    auto* call = Call(param.name, vec4<f32>(1_f, 2_f, 3_f, 4_f), 1_f);
+    auto* call = Call(param.name, Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f), 1_f);
     WrapInFunction(CallStmt(call));
 
     EXPECT_FALSE(r()->Resolve());
diff --git a/src/tint/resolver/builtin_validation_test.cc b/src/tint/resolver/builtin_validation_test.cc
index fbe5a5f..f24fc4b 100644
--- a/src/tint/resolver/builtin_validation_test.cc
+++ b/src/tint/resolver/builtin_validation_test.cc
@@ -19,7 +19,8 @@
 #include "src/tint/sem/value_constructor.h"
 #include "src/tint/utils/string_stream.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::resolver {
 namespace {
@@ -250,10 +251,10 @@
                               i32(values[2]));
             case Kind::kVec3_Scalar_Vec2:
                 return b.Call(src, b.ty.vec3<i32>(), i32(values[0]),
-                              b.vec2<i32>(i32(values[1]), i32(values[2])));
+                              b.Call<vec2<i32>>(i32(values[1]), i32(values[2])));
             case Kind::kVec3_Vec2_Scalar:
-                return b.Call(src, b.ty.vec3<i32>(), b.vec2<i32>(i32(values[0]), i32(values[1])),
-                              i32(values[2]));
+                return b.Call(src, b.ty.vec3<i32>(),
+                              b.Call<vec2<i32>>(i32(values[0]), i32(values[1])), i32(values[2]));
             case Kind::kEmptyVec2:
                 return b.Call(src, b.ty.vec2<i32>());
             case Kind::kEmptyVec3:
diff --git a/src/tint/resolver/builtins_validation_test.cc b/src/tint/resolver/builtins_validation_test.cc
index d5f8c4f..a1cc2e2 100644
--- a/src/tint/resolver/builtins_validation_test.cc
+++ b/src/tint/resolver/builtins_validation_test.cc
@@ -17,20 +17,14 @@
 #include "src/tint/resolver/resolver_test_helper.h"
 #include "src/tint/utils/string_stream.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 template <typename T>
 using DataType = builder::DataType<T>;
-template <typename T>
-using vec2 = builder::vec2<T>;
-template <typename T>
-using vec3 = builder::vec3<T>;
-template <typename T>
-using vec4 = builder::vec4<T>;
-
 class ResolverBuiltinsValidationTest : public resolver::TestHelper, public testing::Test {};
 namespace StageTest {
 struct Params {
@@ -870,21 +864,21 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Length_Float_Vec2) {
-    auto* builtin = Call("length", vec2<f32>(1_f, 1_f));
+    auto* builtin = Call("length", Call<vec2<f32>>(1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Length_Float_Vec3) {
-    auto* builtin = Call("length", vec3<f32>(1_f, 1_f, 1_f));
+    auto* builtin = Call("length", Call<vec3<f32>>(1_f, 1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Length_Float_Vec4) {
-    auto* builtin = Call("length", vec4<f32>(1_f, 1_f, 1_f, 1_f));
+    auto* builtin = Call("length", Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -898,46 +892,50 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Distance_Float_Vec2) {
-    auto* builtin = Call("distance", vec2<f32>(1_f, 1_f), vec2<f32>(1_f, 1_f));
+    auto* builtin = Call("distance", Call<vec2<f32>>(1_f, 1_f), Call<vec2<f32>>(1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Distance_Float_Vec3) {
-    auto* builtin = Call("distance", vec3<f32>(1_f, 1_f, 1_f), vec3<f32>(1_f, 1_f, 1_f));
+    auto* builtin =
+        Call("distance", Call<vec3<f32>>(1_f, 1_f, 1_f), Call<vec3<f32>>(1_f, 1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Distance_Float_Vec4) {
-    auto* builtin = Call("distance", vec4<f32>(1_f, 1_f, 1_f, 1_f), vec4<f32>(1_f, 1_f, 1_f, 1_f));
+    auto* builtin =
+        Call("distance", Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f), Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Determinant_Mat2x2) {
-    auto* builtin = Call("determinant", mat2x2<f32>(vec2<f32>(1_f, 1_f), vec2<f32>(1_f, 1_f)));
+    auto* builtin = Call("determinant",
+                         Call<mat2x2<f32>>(Call<vec2<f32>>(1_f, 1_f), Call<vec2<f32>>(1_f, 1_f)));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Determinant_Mat3x3) {
-    auto* builtin = Call(
-        "determinant",
-        mat3x3<f32>(vec3<f32>(1_f, 1_f, 1_f), vec3<f32>(1_f, 1_f, 1_f), vec3<f32>(1_f, 1_f, 1_f)));
+    auto* builtin = Call("determinant", Call<mat3x3<f32>>(Call<vec3<f32>>(1_f, 1_f, 1_f),
+                                                          Call<vec3<f32>>(1_f, 1_f, 1_f),
+                                                          Call<vec3<f32>>(1_f, 1_f, 1_f)));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Determinant_Mat4x4) {
-    auto* builtin = Call("determinant",
-                         mat4x4<f32>(vec4<f32>(1_f, 1_f, 1_f, 1_f), vec4<f32>(1_f, 1_f, 1_f, 1_f),
-                                     vec4<f32>(1_f, 1_f, 1_f, 1_f), vec4<f32>(1_f, 1_f, 1_f, 1_f)));
+    auto* builtin = Call("determinant", Call<mat4x4<f32>>(Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f),
+                                                          Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f),
+                                                          Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f),
+                                                          Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f)));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -957,7 +955,7 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Frexp_Vec2) {
-    auto* builtin = Call("frexp", vec2<f32>(1_f, 1_f));
+    auto* builtin = Call("frexp", Call<vec2<f32>>(1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -974,7 +972,7 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Frexp_Vec3) {
-    auto* builtin = Call("frexp", vec3<f32>(1_f, 1_f, 1_f));
+    auto* builtin = Call("frexp", Call<vec3<f32>>(1_f, 1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -991,7 +989,7 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Frexp_Vec4) {
-    auto* builtin = Call("frexp", vec4<f32>(1_f, 1_f, 1_f, 1_f));
+    auto* builtin = Call("frexp", Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1021,7 +1019,7 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Modf_Vec2) {
-    auto* builtin = Call("modf", vec2<f32>(1_f, 1_f));
+    auto* builtin = Call("modf", Call<vec2<f32>>(1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1038,7 +1036,7 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Modf_Vec3) {
-    auto* builtin = Call("modf", vec3<f32>(1_f, 1_f, 1_f));
+    auto* builtin = Call("modf", Call<vec3<f32>>(1_f, 1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1055,7 +1053,7 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Modf_Vec4) {
-    auto* builtin = Call("modf", vec4<f32>(1_f, 1_f, 1_f, 1_f));
+    auto* builtin = Call("modf", Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1072,28 +1070,29 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Cross_Float_Vec3) {
-    auto* builtin = Call("cross", vec3<f32>(1_f, 1_f, 1_f), vec3<f32>(1_f, 1_f, 1_f));
+    auto* builtin = Call("cross", Call<vec3<f32>>(1_f, 1_f, 1_f), Call<vec3<f32>>(1_f, 1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Dot_Float_Vec2) {
-    auto* builtin = Call("dot", vec2<f32>(1_f, 1_f), vec2<f32>(1_f, 1_f));
+    auto* builtin = Call("dot", Call<vec2<f32>>(1_f, 1_f), Call<vec2<f32>>(1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Dot_Float_Vec3) {
-    auto* builtin = Call("dot", vec3<f32>(1_f, 1_f, 1_f), vec3<f32>(1_f, 1_f, 1_f));
+    auto* builtin = Call("dot", Call<vec3<f32>>(1_f, 1_f, 1_f), Call<vec3<f32>>(1_f, 1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Dot_Float_Vec4) {
-    auto* builtin = Call("dot", vec4<f32>(1_f, 1_f, 1_f, 1_f), vec4<f32>(1_f, 1_f, 1_f, 1_f));
+    auto* builtin =
+        Call("dot", Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f), Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1121,24 +1120,24 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Select_Float_Vec2) {
-    auto* builtin =
-        Call("select", vec2<f32>(1_f, 1_f), vec2<f32>(1_f, 1_f), vec2<bool>(true, true));
+    auto* builtin = Call("select", Call<vec2<f32>>(1_f, 1_f), Call<vec2<f32>>(1_f, 1_f),
+                         Call<vec2<bool>>(true, true));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Select_Integer_Vec2) {
-    auto* builtin =
-        Call("select", vec2<i32>(1_i, 1_i), vec2<i32>(1_i, 1_i), vec2<bool>(true, true));
+    auto* builtin = Call("select", Call<vec2<i32>>(1_i, 1_i), Call<vec2<i32>>(1_i, 1_i),
+                         Call<vec2<bool>>(true, true));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverBuiltinsValidationTest, Select_Boolean_Vec2) {
-    auto* builtin =
-        Call("select", vec2<bool>(true, true), vec2<bool>(true, true), vec2<bool>(true, true));
+    auto* builtin = Call("select", Call<vec2<bool>>(true, true), Call<vec2<bool>>(true, true),
+                         Call<vec2<bool>>(true, true));
     WrapInFunction(builtin);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1178,7 +1177,7 @@
 
     utils::Vector<const ast::Expression*, 8> params;
     for (uint32_t i = 0; i < num_params; ++i) {
-        params.Push(vec2<f32>(f32(i + 1), f32(i + 1)));
+        params.Push(Call<vec2<f32>>(f32(i + 1), f32(i + 1)));
     }
     auto* builtin = Call(name, params);
     Func("func", utils::Empty, ty.void_(),
@@ -1199,7 +1198,7 @@
 
     utils::Vector<const ast::Expression*, 8> params;
     for (uint32_t i = 0; i < num_params; ++i) {
-        params.Push(vec3<f32>(f32(i + 1), f32(i + 1), f32(i + 1)));
+        params.Push(Call<vec3<f32>>(f32(i + 1), f32(i + 1), f32(i + 1)));
     }
     auto* builtin = Call(name, params);
     Func("func", utils::Empty, ty.void_(),
@@ -1220,7 +1219,7 @@
 
     utils::Vector<const ast::Expression*, 8> params;
     for (uint32_t i = 0; i < num_params; ++i) {
-        params.Push(vec4<f32>(f32(i + 1), f32(i + 1), f32(i + 1), f32(i + 1)));
+        params.Push(Call<vec4<f32>>(f32(i + 1), f32(i + 1), f32(i + 1), f32(i + 1)));
     }
     auto* builtin = Call(name, params);
     Func("func", utils::Empty, ty.void_(),
@@ -1302,7 +1301,7 @@
 
     utils::Vector<const ast::Expression*, 8> params;
     for (uint32_t i = 0; i < num_params; ++i) {
-        params.Push(vec2<u32>(1_u, 1_u));
+        params.Push(Call<vec2<u32>>(1_u, 1_u));
     }
     auto* builtin = Call(name, params);
     WrapInFunction(builtin);
@@ -1317,7 +1316,7 @@
 
     utils::Vector<const ast::Expression*, 8> params;
     for (uint32_t i = 0; i < num_params; ++i) {
-        params.Push(vec3<u32>(1_u, 1_u, 1_u));
+        params.Push(Call<vec3<u32>>(1_u, 1_u, 1_u));
     }
     auto* builtin = Call(name, params);
     WrapInFunction(builtin);
@@ -1332,7 +1331,7 @@
 
     utils::Vector<const ast::Expression*, 8> params;
     for (uint32_t i = 0; i < num_params; ++i) {
-        params.Push(vec4<u32>(1_u, 1_u, 1_u, 1_u));
+        params.Push(Call<vec4<u32>>(1_u, 1_u, 1_u, 1_u));
     }
     auto* builtin = Call(name, params);
     WrapInFunction(builtin);
@@ -1362,7 +1361,7 @@
 
     utils::Vector<const ast::Expression*, 8> params;
     for (uint32_t i = 0; i < num_params; ++i) {
-        params.Push(vec2<i32>(1_i, 1_i));
+        params.Push(Call<vec2<i32>>(1_i, 1_i));
     }
     auto* builtin = Call(name, params);
     WrapInFunction(builtin);
@@ -1377,7 +1376,7 @@
 
     utils::Vector<const ast::Expression*, 8> params;
     for (uint32_t i = 0; i < num_params; ++i) {
-        params.Push(vec3<i32>(1_i, 1_i, 1_i));
+        params.Push(Call<vec3<i32>>(1_i, 1_i, 1_i));
     }
     auto* builtin = Call(name, params);
     WrapInFunction(builtin);
@@ -1392,7 +1391,7 @@
 
     utils::Vector<const ast::Expression*, 8> params;
     for (uint32_t i = 0; i < num_params; ++i) {
-        params.Push(vec4<i32>(1_i, 1_i, 1_i, 1_i));
+        params.Push(Call<vec4<i32>>(1_i, 1_i, 1_i, 1_i));
     }
     auto* builtin = Call(name, params);
     WrapInFunction(builtin);
@@ -1419,7 +1418,7 @@
 
     utils::Vector<const ast::Expression*, 8> params;
     for (uint32_t i = 0; i < num_params; ++i) {
-        params.Push(vec2<bool>(true, true));
+        params.Push(Call<vec2<bool>>(true, true));
     }
     auto* builtin = Call(name, params);
     WrapInFunction(builtin);
@@ -1433,7 +1432,7 @@
 
     utils::Vector<const ast::Expression*, 8> params;
     for (uint32_t i = 0; i < num_params; ++i) {
-        params.Push(vec3<bool>(true, true, true));
+        params.Push(Call<vec3<bool>>(true, true, true));
     }
     auto* builtin = Call(name, params);
     WrapInFunction(builtin);
@@ -1447,7 +1446,7 @@
 
     utils::Vector<const ast::Expression*, 8> params;
     for (uint32_t i = 0; i < num_params; ++i) {
-        params.Push(vec4<bool>(true, true, true, true));
+        params.Push(Call<vec4<bool>>(true, true, true, true));
     }
     auto* builtin = Call(name, params);
     WrapInFunction(builtin);
@@ -1463,7 +1462,7 @@
 
 TEST_P(DataPacking4x8, Float_Vec4) {
     auto name = GetParam();
-    auto* builtin = Call(name, vec4<f32>(1_f, 1_f, 1_f, 1_f));
+    auto* builtin = Call(name, Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f));
     WrapInFunction(builtin);
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -1476,7 +1475,7 @@
 
 TEST_P(DataPacking2x16, Float_Vec2) {
     auto name = GetParam();
-    auto* builtin = Call(name, vec2<f32>(1_f, 1_f));
+    auto* builtin = Call(name, Call<vec2<f32>>(1_f, 1_f));
     WrapInFunction(builtin);
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
diff --git a/src/tint/resolver/call_test.cc b/src/tint/resolver/call_test.cc
index 25f4814..6ebd629 100644
--- a/src/tint/resolver/call_test.cc
+++ b/src/tint/resolver/call_test.cc
@@ -18,39 +18,21 @@
 #include "src/tint/ast/call_statement.h"
 #include "src/tint/resolver/resolver_test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
-// Helpers and typedefs
-template <typename T>
-using DataType = builder::DataType<T>;
-template <int N, typename T>
-using vec = builder::vec<N, T>;
-template <typename T>
-using vec2 = builder::vec2<T>;
-template <typename T>
-using vec3 = builder::vec3<T>;
-template <typename T>
-using vec4 = builder::vec4<T>;
-template <int N, int M, typename T>
-using mat = builder::mat<N, M, T>;
-template <typename T>
-using mat2x2 = builder::mat2x2<T>;
-template <typename T>
-using mat2x3 = builder::mat2x3<T>;
-template <typename T>
-using mat3x2 = builder::mat3x2<T>;
-template <typename T>
-using mat3x3 = builder::mat3x3<T>;
-template <typename T>
-using mat4x4 = builder::mat4x4<T>;
+
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 template <typename T, int ID = 0>
 using alias = builder::alias<T, ID>;
+
 template <typename T>
 using alias1 = builder::alias1<T>;
+
 template <typename T>
 using alias2 = builder::alias2<T>;
+
 template <typename T>
 using alias3 = builder::alias3<T>;
 
@@ -63,7 +45,7 @@
 
 template <typename T>
 constexpr Params ParamsFor() {
-    return Params{DataType<T>::ExprFromDouble, DataType<T>::AST};
+    return Params{builder::DataType<T>::ExprFromDouble, builder::DataType<T>::AST};
 }
 
 static constexpr Params all_param_types[] = {
diff --git a/src/tint/resolver/call_validation_test.cc b/src/tint/resolver/call_validation_test.cc
index bf533cc..571dd07 100644
--- a/src/tint/resolver/call_validation_test.cc
+++ b/src/tint/resolver/call_validation_test.cc
@@ -18,7 +18,8 @@
 #include "src/tint/ast/call_statement.h"
 #include "src/tint/resolver/resolver_test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::resolver {
 namespace {
@@ -103,7 +104,7 @@
     //   var z: i32 = 1i;
     //   foo(&z);
     // }
-    auto* param = Param("p", ty.ptr<i32>(builtin::AddressSpace::kFunction));
+    auto* param = Param("p", ty.ptr<function, i32>());
     Func("foo", utils::Vector{param}, ty.void_(), utils::Empty);
     Func("main", utils::Empty, ty.void_(),
          utils::Vector{
@@ -120,7 +121,7 @@
     //   let z: i32 = 1i;
     //   foo(&z);
     // }
-    auto* param = Param("p", ty.ptr<i32>(builtin::AddressSpace::kFunction));
+    auto* param = Param("p", ty.ptr<function, i32>());
     Func("foo", utils::Vector{param}, ty.void_(), utils::Empty);
     Func("main", utils::Empty, ty.void_(),
          utils::Vector{
@@ -142,7 +143,7 @@
     auto* S = Structure("S", utils::Vector{
                                  Member("m", ty.i32()),
                              });
-    auto* param = Param("p", ty.ptr<i32>(builtin::AddressSpace::kFunction));
+    auto* param = Param("p", ty.ptr<function, i32>());
     Func("foo", utils::Vector{param}, ty.void_(), utils::Empty);
     Func("main", utils::Empty, ty.void_(),
          utils::Vector{
@@ -169,7 +170,7 @@
     auto* S = Structure("S", utils::Vector{
                                  Member("m", ty.i32()),
                              });
-    auto* param = Param("p", ty.ptr<i32>(builtin::AddressSpace::kFunction));
+    auto* param = Param("p", ty.ptr<function, i32>());
     Func("foo", utils::Vector{param}, ty.void_(), utils::Empty);
     Func("main", utils::Empty, ty.void_(),
          utils::Vector{
@@ -189,7 +190,7 @@
     auto* S = Structure("S", utils::Vector{
                                  Member("m", ty.i32()),
                              });
-    auto* param = Param("p", ty.ptr<i32>(builtin::AddressSpace::kFunction));
+    auto* param = Param("p", ty.ptr<function, i32>());
     Func("foo", utils::Vector{param}, ty.void_(), utils::Empty);
     Func("main", utils::Empty, ty.void_(),
          utils::Vector{
@@ -208,12 +209,12 @@
     // }
     Func("foo",
          utils::Vector{
-             Param("p", ty.ptr<i32>(builtin::AddressSpace::kFunction)),
+             Param("p", ty.ptr<function, i32>()),
          },
          ty.void_(), utils::Empty);
     Func("bar",
          utils::Vector{
-             Param("p", ty.ptr<i32>(builtin::AddressSpace::kFunction)),
+             Param("p", ty.ptr<function, i32>()),
          },
          ty.void_(),
          utils::Vector{
@@ -235,12 +236,12 @@
     // }
     Func("foo",
          utils::Vector{
-             Param("p", ty.ptr<i32>(builtin::AddressSpace::kFunction)),
+             Param("p", ty.ptr<function, i32>()),
          },
          ty.void_(), utils::Empty);
     Func("bar",
          utils::Vector{
-             Param("p", ty.ptr<i32>(builtin::AddressSpace::kFunction)),
+             Param("p", ty.ptr<function, i32>()),
          },
          ty.void_(),
          utils::Vector{
@@ -268,13 +269,13 @@
     // }
     Func("x",
          utils::Vector{
-             Param("p", ty.ptr<i32>(builtin::AddressSpace::kFunction)),
+             Param("p", ty.ptr<function, i32>()),
          },
          ty.void_(), utils::Empty);
     Func("main", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(Var("v", ty.i32())),
-             Decl(Let("p", ty.ptr(builtin::AddressSpace::kFunction, ty.i32()), AddressOf("v"))),
+             Decl(Let("p", ty.ptr<function, i32>(), AddressOf("v"))),
              CallStmt(Call("x", "p")),
          },
          utils::Vector{
@@ -293,13 +294,13 @@
     // }
     Func("foo",
          utils::Vector{
-             Param("p", ty.ptr<i32>(builtin::AddressSpace::kPrivate)),
+             Param("p", ty.ptr<private_, i32>()),
          },
          ty.void_(), utils::Empty);
     GlobalVar("v", ty.i32(), builtin::AddressSpace::kPrivate);
     Func("main", utils::Empty, ty.void_(),
          utils::Vector{
-             Decl(Let("p", ty.ptr(builtin::AddressSpace::kPrivate, ty.i32()), AddressOf("v"))),
+             Decl(Let("p", ty.ptr<private_, i32>(), AddressOf("v"))),
              CallStmt(Call("foo", Expr(Source{{12, 34}}, "p"))),
          },
          utils::Vector{
@@ -318,14 +319,13 @@
     // }
     Func("foo",
          utils::Vector{
-             Param("p", ty.ptr<i32>(builtin::AddressSpace::kFunction)),
+             Param("p", ty.ptr<function, i32>()),
          },
          ty.void_(), utils::Empty);
     Func("main", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(Var("v", ty.array<i32, 4>())),
-             Decl(Let("p", ty.ptr(builtin::AddressSpace::kFunction, ty.i32()),
-                      AddressOf(IndexAccessor("v", 0_a)))),
+             Decl(Let("p", ty.ptr<function, i32>(), AddressOf(IndexAccessor("v", 0_a)))),
              CallStmt(Call("foo", Expr(Source{{12, 34}}, "p"))),
          },
          utils::Vector{
@@ -349,14 +349,13 @@
     Enable(builtin::Extension::kChromiumExperimentalFullPtrParameters);
     Func("foo",
          utils::Vector{
-             Param("p", ty.ptr<i32>(builtin::AddressSpace::kFunction)),
+             Param("p", ty.ptr<function, i32>()),
          },
          ty.void_(), utils::Empty);
     Func("main", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(Var("v", ty.array<i32, 4>())),
-             Decl(Let("p", ty.ptr(builtin::AddressSpace::kFunction, ty.i32()),
-                      AddressOf(IndexAccessor("v", 0_a)))),
+             Decl(Let("p", ty.ptr<function, i32>(), AddressOf(IndexAccessor("v", 0_a)))),
              CallStmt(Call("foo", Expr(Source{{12, 34}}, "p"))),
          },
          utils::Vector{
@@ -377,7 +376,7 @@
     // }
     Func("foo",
          utils::Vector{
-             Param("p", ty.ptr(builtin::AddressSpace::kFunction, ty.array<i32, 4>())),
+             Param("p", ty.ptr<function, array<i32, 4>>()),
          },
          ty.void_(), utils::Empty);
     Func("main", utils::Empty, ty.void_(),
@@ -406,7 +405,7 @@
     // }
     Func("foo",
          utils::Vector{
-             Param("p", ty.ptr<i32>(builtin::AddressSpace::kFunction)),
+             Param("p", ty.ptr<function, i32>()),
          },
          ty.void_(), utils::Empty);
     Func("main", utils::Empty, ty.void_(),
@@ -440,7 +439,7 @@
     Enable(builtin::Extension::kChromiumExperimentalFullPtrParameters);
     Func("foo",
          utils::Vector{
-             Param("p", ty.ptr<i32>(builtin::AddressSpace::kFunction)),
+             Param("p", ty.ptr<function, i32>()),
          },
          ty.void_(), utils::Empty);
     Func("main", utils::Empty, ty.void_(),
diff --git a/src/tint/resolver/compound_assignment_validation_test.cc b/src/tint/resolver/compound_assignment_validation_test.cc
index 0343f08..0acf993 100644
--- a/src/tint/resolver/compound_assignment_validation_test.cc
+++ b/src/tint/resolver/compound_assignment_validation_test.cc
@@ -18,13 +18,13 @@
 #include "src/tint/resolver/resolver_test_helper.h"
 #include "src/tint/type/storage_texture.h"
 
-using ::testing::HasSubstr;
-
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using ::testing::HasSubstr;
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using ResolverCompoundAssignmentValidationTest = ResolverTest;
 
 TEST_F(ResolverCompoundAssignmentValidationTest, CompatibleTypes) {
@@ -51,9 +51,8 @@
     // var a : i32;
     // let b : ptr<function,i32> = &a;
     // *b += 2;
-    const auto func = builtin::AddressSpace::kFunction;
-    auto* var_a = Var("a", ty.i32(), func, Expr(2_i));
-    auto* var_b = Let("b", ty.ptr<i32>(func), AddressOf(Expr("a")));
+    auto* var_a = Var("a", ty.i32(), builtin::AddressSpace::kFunction, Expr(2_i));
+    auto* var_b = Let("b", ty.ptr<function, i32>(), AddressOf(Expr("a")));
     WrapInFunction(var_a, var_b,
                    CompoundAssign(Source{{12, 34}}, Deref("b"), 2_i, ast::BinaryOp::kAdd));
 
@@ -116,7 +115,7 @@
 
     auto* var = Var("a", ty.f32());
 
-    auto* assign = CompoundAssign(Source{{12, 34}}, "a", vec4<f32>(), ast::BinaryOp::kAdd);
+    auto* assign = CompoundAssign(Source{{12, 34}}, "a", Call<vec4<f32>>(), ast::BinaryOp::kAdd);
     WrapInFunction(var, assign);
 
     ASSERT_FALSE(r()->Resolve());
@@ -146,7 +145,8 @@
 
     auto* var = Var("a", ty.f32());
 
-    auto* assign = CompoundAssign(Source{{12, 34}}, "a", mat4x4<f32>(), ast::BinaryOp::kMultiply);
+    auto* assign =
+        CompoundAssign(Source{{12, 34}}, "a", Call<mat4x4<f32>>(), ast::BinaryOp::kMultiply);
     WrapInFunction(var, assign);
 
     ASSERT_FALSE(r()->Resolve());
@@ -162,7 +162,8 @@
 
     auto* var = Var("a", ty.vec4<f32>());
 
-    auto* assign = CompoundAssign(Source{{12, 34}}, "a", mat4x4<f32>(), ast::BinaryOp::kMultiply);
+    auto* assign =
+        CompoundAssign(Source{{12, 34}}, "a", Call<mat4x4<f32>>(), ast::BinaryOp::kMultiply);
     WrapInFunction(var, assign);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -176,7 +177,8 @@
 
     auto* var = Var("a", ty.vec4<f32>());
 
-    auto* assign = CompoundAssign(Source{{12, 34}}, "a", mat4x2<f32>(), ast::BinaryOp::kMultiply);
+    auto* assign =
+        CompoundAssign(Source{{12, 34}}, "a", Call<mat4x2<f32>>(), ast::BinaryOp::kMultiply);
     WrapInFunction(var, assign);
 
     ASSERT_FALSE(r()->Resolve());
@@ -194,7 +196,8 @@
 
     auto* var = Var("a", ty.vec4<f32>());
 
-    auto* assign = CompoundAssign(Source{{12, 34}}, "a", mat2x4<f32>(), ast::BinaryOp::kMultiply);
+    auto* assign =
+        CompoundAssign(Source{{12, 34}}, "a", Call<mat2x4<f32>>(), ast::BinaryOp::kMultiply);
     WrapInFunction(var, assign);
 
     ASSERT_FALSE(r()->Resolve());
@@ -210,7 +213,8 @@
 
     auto* var = Var("a", ty.mat4x4<f32>());
 
-    auto* assign = CompoundAssign(Source{{12, 34}}, "a", vec4<f32>(), ast::BinaryOp::kMultiply);
+    auto* assign =
+        CompoundAssign(Source{{12, 34}}, "a", Call<vec4<f32>>(), ast::BinaryOp::kMultiply);
     WrapInFunction(var, assign);
 
     ASSERT_FALSE(r()->Resolve());
diff --git a/src/tint/resolver/const_eval.cc b/src/tint/resolver/const_eval.cc
index 3fa71cd..73e274b 100644
--- a/src/tint/resolver/const_eval.cc
+++ b/src/tint/resolver/const_eval.cc
@@ -22,11 +22,11 @@
 #include <type_traits>
 #include <utility>
 
+#include "src/tint/builtin/number.h"
 #include "src/tint/constant/composite.h"
 #include "src/tint/constant/scalar.h"
 #include "src/tint/constant/splat.h"
 #include "src/tint/constant/value.h"
-#include "src/tint/number.h"
 #include "src/tint/program_builder.h"
 #include "src/tint/sem/member_accessor_expression.h"
 #include "src/tint/sem/value_constructor.h"
diff --git a/src/tint/resolver/const_eval.h b/src/tint/resolver/const_eval.h
index 9303656..0253d30 100644
--- a/src/tint/resolver/const_eval.h
+++ b/src/tint/resolver/const_eval.h
@@ -18,7 +18,7 @@
 #include <stddef.h>
 #include <string>
 
-#include "src/tint/number.h"
+#include "src/tint/builtin/number.h"
 #include "src/tint/type/type.h"
 #include "src/tint/utils/result.h"
 #include "src/tint/utils/vector.h"
diff --git a/src/tint/resolver/const_eval_binary_op_test.cc b/src/tint/resolver/const_eval_binary_op_test.cc
index e61599f..dac78ce 100644
--- a/src/tint/resolver/const_eval_binary_op_test.cc
+++ b/src/tint/resolver/const_eval_binary_op_test.cc
@@ -17,7 +17,8 @@
 #include "src/tint/reader/wgsl/parser.h"
 #include "src/tint/utils/result.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 using ::testing::HasSubstr;
 
 namespace tint::resolver {
@@ -1690,7 +1691,7 @@
     // const i = 4;
     // const result = (one == 0) && (a[i] == 0);
     GlobalConst("one", Expr(1_a));
-    GlobalConst("a", array<i32, 3>(1_i, 2_i, 3_i));
+    GlobalConst("a", Call<array<i32, 3>>(1_i, 2_i, 3_i));
     GlobalConst("i", Expr(4_a));
     auto* lhs = Equal("one", 0_a);
     auto* rhs = Equal(IndexAccessor("a", "i"), 0_a);
@@ -1707,7 +1708,7 @@
     // const i = 3;
     // const result = (one == 1) && (a[i] == 0);
     GlobalConst("one", Expr(1_a));
-    GlobalConst("a", array<i32, 3>(1_i, 2_i, 3_i));
+    GlobalConst("a", Call<array<i32, 3>>(1_i, 2_i, 3_i));
     GlobalConst("i", Expr(3_a));
     auto* lhs = Equal("one", 1_a);
     auto* rhs = Equal(IndexAccessor("a", Expr(Source{{12, 34}}, "i")), 0_a);
@@ -1724,7 +1725,7 @@
     // const i = 3;
     // const result = (one == 0) && (a[i] == 0.0f);
     GlobalConst("one", Expr(1_a));
-    GlobalConst("a", array<i32, 3>(1_i, 2_i, 3_i));
+    GlobalConst("a", Call<array<i32, 3>>(1_i, 2_i, 3_i));
     GlobalConst("i", Expr(3_a));
     auto* lhs = Equal("one", 0_a);
     auto* rhs = Equal(Source{{12, 34}}, IndexAccessor("a", "i"), 0.0_f);
@@ -1747,7 +1748,7 @@
     // const i = 4;
     // const result = (one == 1) || (a[i] == 0);
     GlobalConst("one", Expr(1_a));
-    GlobalConst("a", array<i32, 3>(1_i, 2_i, 3_i));
+    GlobalConst("a", Call<array<i32, 3>>(1_i, 2_i, 3_i));
     GlobalConst("i", Expr(4_a));
     auto* lhs = Equal("one", 1_a);
     auto* rhs = Equal(IndexAccessor("a", "i"), 0_a);
@@ -1764,7 +1765,7 @@
     // const i = 3;
     // const result = (one == 0) || (a[i] == 0);
     GlobalConst("one", Expr(1_a));
-    GlobalConst("a", array<i32, 3>(1_i, 2_i, 3_i));
+    GlobalConst("a", Call<array<i32, 3>>(1_i, 2_i, 3_i));
     GlobalConst("i", Expr(3_a));
     auto* lhs = Equal("one", 0_a);
     auto* rhs = Equal(IndexAccessor("a", Expr(Source{{12, 34}}, "i")), 0_a);
@@ -1781,7 +1782,7 @@
     // const i = 3;
     // const result = (one == 1) || (a[i] == 0.0f);
     GlobalConst("one", Expr(1_a));
-    GlobalConst("a", array<i32, 3>(1_i, 2_i, 3_i));
+    GlobalConst("a", Call<array<i32, 3>>(1_i, 2_i, 3_i));
     GlobalConst("i", Expr(3_a));
     auto* lhs = Equal("one", 1_a);
     auto* rhs = Equal(Source{{12, 34}}, IndexAccessor("a", "i"), 0.0_f);
@@ -1914,7 +1915,8 @@
     // const result = (one == 0) && (vec2<f32>(1.0, true).x == 0.0);
     GlobalConst("one", Expr(1_a));
     auto* lhs = Equal("one", 0_a);
-    auto* rhs = Equal(MemberAccessor(vec2<f32>(Source{{12, 34}}, 1.0_a, Expr(true)), "x"), 0.0_a);
+    auto* rhs =
+        Equal(MemberAccessor(Call<vec2<f32>>(Source{{12, 34}}, 1.0_a, Expr(true)), "x"), 0.0_a);
     GlobalConst("result", LogicalAnd(lhs, rhs));
 
     EXPECT_FALSE(r()->Resolve());
@@ -1942,7 +1944,8 @@
     // const result = (one == 1) || (vec2<f32>(1.0, true).x == 0.0);
     GlobalConst("one", Expr(1_a));
     auto* lhs = Equal("one", 0_a);
-    auto* rhs = Equal(MemberAccessor(vec2<f32>(Source{{12, 34}}, 1.0_a, Expr(true)), "x"), 0.0_a);
+    auto* rhs =
+        Equal(MemberAccessor(Call<vec2<f32>>(Source{{12, 34}}, 1.0_a, Expr(true)), "x"), 0.0_a);
     GlobalConst("result", LogicalOr(lhs, rhs));
 
     EXPECT_FALSE(r()->Resolve());
@@ -2328,7 +2331,8 @@
     // const result = (one == 0) && (vec2(1, 2).z == 0);
     GlobalConst("one", Expr(1_a));
     auto* lhs = Equal("one", 0_a);
-    auto* rhs = Equal(MemberAccessor(vec2<Infer>(1_a, 2_a), Ident(Source{{12, 34}}, "z")), 0_a);
+    auto* rhs =
+        Equal(MemberAccessor(Call<vec2<Infer>>(1_a, 2_a), Ident(Source{{12, 34}}, "z")), 0_a);
     GlobalConst("result", LogicalAnd(lhs, rhs));
 
     EXPECT_FALSE(r()->Resolve());
@@ -2340,7 +2344,8 @@
     // const result = (one == 1) || (vec2(1, 2).z == 0);
     GlobalConst("one", Expr(1_a));
     auto* lhs = Equal("one", 1_a);
-    auto* rhs = Equal(MemberAccessor(vec2<Infer>(1_a, 2_a), Ident(Source{{12, 34}}, "z")), 0_a);
+    auto* rhs =
+        Equal(MemberAccessor(Call<vec2<Infer>>(1_a, 2_a), Ident(Source{{12, 34}}, "z")), 0_a);
     GlobalConst("result", LogicalOr(lhs, rhs));
 
     EXPECT_FALSE(r()->Resolve());
diff --git a/src/tint/resolver/const_eval_bitcast_test.cc b/src/tint/resolver/const_eval_bitcast_test.cc
index cbb09d5..c52e2e3 100644
--- a/src/tint/resolver/const_eval_bitcast_test.cc
+++ b/src/tint/resolver/const_eval_bitcast_test.cc
@@ -14,11 +14,12 @@
 
 #include "src/tint/resolver/const_eval_test.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 struct Case {
     Value input;
     struct Success {
@@ -169,24 +170,24 @@
                                      Vec(0_i, 0x3F800000_i, 0x42F60000_i)),
 
                              // Unrepresentable
-                             Failure<f32>(Val(nan_as_u32)),                          //
-                             Failure<f32>(Val(nan_as_i32)),                          //
-                             Failure<f32>(Val(inf_as_u32)),                          //
-                             Failure<f32>(Val(inf_as_i32)),                          //
-                             Failure<f32>(Val(neg_inf_as_u32)),                      //
-                             Failure<f32>(Val(neg_inf_as_i32)),                      //
-                             Failure<builder::vec2<f32>>(Vec(nan_as_u32, 0_u)),      //
-                             Failure<builder::vec2<f32>>(Vec(nan_as_i32, 0_i)),      //
-                             Failure<builder::vec2<f32>>(Vec(inf_as_u32, 0_u)),      //
-                             Failure<builder::vec2<f32>>(Vec(inf_as_i32, 0_i)),      //
-                             Failure<builder::vec2<f32>>(Vec(neg_inf_as_u32, 0_u)),  //
-                             Failure<builder::vec2<f32>>(Vec(neg_inf_as_i32, 0_i)),  //
-                             Failure<builder::vec2<f32>>(Vec(0_u, nan_as_u32)),      //
-                             Failure<builder::vec2<f32>>(Vec(0_i, nan_as_i32)),      //
-                             Failure<builder::vec2<f32>>(Vec(0_u, inf_as_u32)),      //
-                             Failure<builder::vec2<f32>>(Vec(0_i, inf_as_i32)),      //
-                             Failure<builder::vec2<f32>>(Vec(0_u, neg_inf_as_u32)),  //
-                             Failure<builder::vec2<f32>>(Vec(0_i, neg_inf_as_i32)),  //
+                             Failure<f32>(Val(nan_as_u32)),                 //
+                             Failure<f32>(Val(nan_as_i32)),                 //
+                             Failure<f32>(Val(inf_as_u32)),                 //
+                             Failure<f32>(Val(inf_as_i32)),                 //
+                             Failure<f32>(Val(neg_inf_as_u32)),             //
+                             Failure<f32>(Val(neg_inf_as_i32)),             //
+                             Failure<vec2<f32>>(Vec(nan_as_u32, 0_u)),      //
+                             Failure<vec2<f32>>(Vec(nan_as_i32, 0_i)),      //
+                             Failure<vec2<f32>>(Vec(inf_as_u32, 0_u)),      //
+                             Failure<vec2<f32>>(Vec(inf_as_i32, 0_i)),      //
+                             Failure<vec2<f32>>(Vec(neg_inf_as_u32, 0_u)),  //
+                             Failure<vec2<f32>>(Vec(neg_inf_as_i32, 0_i)),  //
+                             Failure<vec2<f32>>(Vec(0_u, nan_as_u32)),      //
+                             Failure<vec2<f32>>(Vec(0_i, nan_as_i32)),      //
+                             Failure<vec2<f32>>(Vec(0_u, inf_as_u32)),      //
+                             Failure<vec2<f32>>(Vec(0_i, inf_as_i32)),      //
+                             Failure<vec2<f32>>(Vec(0_u, neg_inf_as_u32)),  //
+                             Failure<vec2<f32>>(Vec(0_i, neg_inf_as_i32)),  //
                          }));
 
 }  // namespace
diff --git a/src/tint/resolver/const_eval_construction_test.cc b/src/tint/resolver/const_eval_construction_test.cc
index 3d595140..4ecca7f 100644
--- a/src/tint/resolver/const_eval_construction_test.cc
+++ b/src/tint/resolver/const_eval_construction_test.cc
@@ -14,11 +14,12 @@
 
 #include "src/tint/resolver/const_eval_test.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 TEST_F(ResolverConstEvalTest, Scalar_AFloat) {
     auto* expr = Expr(99.0_a);
     auto* a = Const("a", expr);
@@ -189,26 +190,26 @@
                              C<f32>(),
                              C<f16>(),
                              C<bool>(),
-                             C<builder::vec2<AInt>>(),
-                             C<builder::vec3<AInt>>(),
-                             C<builder::vec4<AInt>>(),
-                             C<builder::vec3<u32>>(),
-                             C<builder::vec3<i32>>(),
-                             C<builder::vec3<f32>>(),
-                             C<builder::vec3<f16>>(),
-                             C<builder::mat2x2<f32>>(),
-                             C<builder::mat2x2<f16>>(),
-                             C<builder::array<3, u32>>(),
-                             C<builder::array<3, i32>>(),
-                             C<builder::array<3, f32>>(),
-                             C<builder::array<3, f16>>(),
-                             C<builder::array<3, bool>>(),
+                             C<vec2<AInt>>(),
+                             C<vec3<AInt>>(),
+                             C<vec4<AInt>>(),
+                             C<vec3<u32>>(),
+                             C<vec3<i32>>(),
+                             C<vec3<f32>>(),
+                             C<vec3<f16>>(),
+                             C<mat2x2<f32>>(),
+                             C<mat2x2<f16>>(),
+                             C<array<u32, 3>>(),
+                             C<array<i32, 3>>(),
+                             C<array<f32, 3>>(),
+                             C<array<f16, 3>>(),
+                             C<array<bool, 3>>(),
                          }));
 
 }  // namespace ZeroInit
 
 TEST_F(ResolverConstEvalTest, Vec3_ZeroInit_i32) {
-    auto* expr = vec3<i32>();
+    auto* expr = Call<vec3<i32>>();
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -237,7 +238,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_ZeroInit_u32) {
-    auto* expr = vec3<u32>();
+    auto* expr = Call<vec3<u32>>();
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -266,7 +267,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_ZeroInit_f32) {
-    auto* expr = vec3<f32>();
+    auto* expr = Call<vec3<f32>>();
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -297,7 +298,7 @@
 TEST_F(ResolverConstEvalTest, Vec3_ZeroInit_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* expr = vec3<f16>();
+    auto* expr = Call<vec3<f16>>();
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -326,7 +327,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_ZeroInit_bool) {
-    auto* expr = vec3<bool>();
+    auto* expr = Call<vec3<bool>>();
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -355,7 +356,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_Splat_i32) {
-    auto* expr = vec3<i32>(99_i);
+    auto* expr = Call<vec3<i32>>(99_i);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -384,7 +385,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_Splat_u32) {
-    auto* expr = vec3<u32>(99_u);
+    auto* expr = Call<vec3<u32>>(99_u);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -413,7 +414,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_Splat_f32) {
-    auto* expr = vec3<f32>(9.9_f);
+    auto* expr = Call<vec3<f32>>(9.9_f);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -444,7 +445,7 @@
 TEST_F(ResolverConstEvalTest, Vec3_Splat_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* expr = vec3<f16>(9.9_h);
+    auto* expr = Call<vec3<f16>>(9.9_h);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -474,7 +475,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_Splat_bool) {
-    auto* expr = vec3<bool>(true);
+    auto* expr = Call<vec3<bool>>(true);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -503,7 +504,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_FullConstruct_AInt) {
-    auto* expr = vec3<Infer>(1_a, 2_a, 3_a);
+    auto* expr = Call<vec3<Infer>>(1_a, 2_a, 3_a);
     auto* a = Const("a", expr);
     WrapInFunction(a);
 
@@ -533,7 +534,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_FullConstruct_AFloat) {
-    auto* expr = vec3<Infer>(1.0_a, 2.0_a, 3.0_a);
+    auto* expr = Call<vec3<Infer>>(1.0_a, 2.0_a, 3.0_a);
     auto* a = Const("a", expr);
     WrapInFunction(a);
 
@@ -563,7 +564,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_FullConstruct_i32) {
-    auto* expr = vec3<i32>(1_i, 2_i, 3_i);
+    auto* expr = Call<vec3<i32>>(1_i, 2_i, 3_i);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -592,7 +593,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_FullConstruct_u32) {
-    auto* expr = vec3<u32>(1_u, 2_u, 3_u);
+    auto* expr = Call<vec3<u32>>(1_u, 2_u, 3_u);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -621,7 +622,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_FullConstruct_f32) {
-    auto* expr = vec3<f32>(1_f, 2_f, 3_f);
+    auto* expr = Call<vec3<f32>>(1_f, 2_f, 3_f);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -652,7 +653,7 @@
 TEST_F(ResolverConstEvalTest, Vec3_FullConstruct_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* expr = vec3<f16>(1_h, 2_h, 3_h);
+    auto* expr = Call<vec3<f16>>(1_h, 2_h, 3_h);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -681,7 +682,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_FullConstruct_bool) {
-    auto* expr = vec3<bool>(true, false, true);
+    auto* expr = Call<vec3<bool>>(true, false, true);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -710,7 +711,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_MixConstruct_i32) {
-    auto* expr = vec3<i32>(1_i, vec2<i32>(2_i, 3_i));
+    auto* expr = Call<vec3<i32>>(1_i, Call<vec2<i32>>(2_i, 3_i));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -739,7 +740,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_MixConstruct_u32) {
-    auto* expr = vec3<u32>(vec2<u32>(1_u, 2_u), 3_u);
+    auto* expr = Call<vec3<u32>>(Call<vec2<u32>>(1_u, 2_u), 3_u);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -768,7 +769,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_MixConstruct_f32) {
-    auto* expr = vec3<f32>(1_f, vec2<f32>(2_f, 3_f));
+    auto* expr = Call<vec3<f32>>(1_f, Call<vec2<f32>>(2_f, 3_f));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -797,7 +798,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_MixConstruct_f32_all_10) {
-    auto* expr = vec3<f32>(10_f, vec2<f32>(10_f, 10_f));
+    auto* expr = Call<vec3<f32>>(10_f, Call<vec2<f32>>(10_f, 10_f));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -826,7 +827,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_MixConstruct_f32_all_positive_0) {
-    auto* expr = vec3<f32>(0_f, vec2<f32>(0_f, 0_f));
+    auto* expr = Call<vec3<f32>>(0_f, Call<vec2<f32>>(0_f, 0_f));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -855,7 +856,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_MixConstruct_f32_all_negative_0) {
-    auto* expr = vec3<f32>(vec2<f32>(-0_f, -0_f), -0_f);
+    auto* expr = Call<vec3<f32>>(Call<vec2<f32>>(-0_f, -0_f), -0_f);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -884,7 +885,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_MixConstruct_f32_mixed_sign_0) {
-    auto* expr = vec3<f32>(0_f, vec2<f32>(-0_f, 0_f));
+    auto* expr = Call<vec3<f32>>(0_f, Call<vec2<f32>>(-0_f, 0_f));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -915,7 +916,7 @@
 TEST_F(ResolverConstEvalTest, Vec3_MixConstruct_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* expr = vec3<f16>(1_h, vec2<f16>(2_h, 3_h));
+    auto* expr = Call<vec3<f16>>(1_h, Call<vec2<f16>>(2_h, 3_h));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -946,7 +947,7 @@
 TEST_F(ResolverConstEvalTest, Vec3_MixConstruct_f16_all_10) {
     Enable(builtin::Extension::kF16);
 
-    auto* expr = vec3<f16>(10_h, vec2<f16>(10_h, 10_h));
+    auto* expr = Call<vec3<f16>>(10_h, Call<vec2<f16>>(10_h, 10_h));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -977,7 +978,7 @@
 TEST_F(ResolverConstEvalTest, Vec3_MixConstruct_f16_all_positive_0) {
     Enable(builtin::Extension::kF16);
 
-    auto* expr = vec3<f16>(0_h, vec2<f16>(0_h, 0_h));
+    auto* expr = Call<vec3<f16>>(0_h, Call<vec2<f16>>(0_h, 0_h));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1008,7 +1009,7 @@
 TEST_F(ResolverConstEvalTest, Vec3_MixConstruct_f16_all_negative_0) {
     Enable(builtin::Extension::kF16);
 
-    auto* expr = vec3<f16>(vec2<f16>(-0_h, -0_h), -0_h);
+    auto* expr = Call<vec3<f16>>(Call<vec2<f16>>(-0_h, -0_h), -0_h);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1039,7 +1040,7 @@
 TEST_F(ResolverConstEvalTest, Vec3_MixConstruct_f16_mixed_sign_0) {
     Enable(builtin::Extension::kF16);
 
-    auto* expr = vec3<f16>(0_h, vec2<f16>(-0_h, 0_h));
+    auto* expr = Call<vec3<f16>>(0_h, Call<vec2<f16>>(-0_h, 0_h));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1068,7 +1069,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_MixConstruct_bool) {
-    auto* expr = vec3<bool>(vec2<bool>(true, false), true);
+    auto* expr = Call<vec3<bool>>(Call<vec2<bool>>(true, false), true);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1097,7 +1098,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_MixConstruct_all_true) {
-    auto* expr = vec3<bool>(true, vec2<bool>(true, true));
+    auto* expr = Call<vec3<bool>>(true, Call<vec2<bool>>(true, true));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1126,7 +1127,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_MixConstruct_all_false) {
-    auto* expr = vec3<bool>(false, vec2<bool>(false, false));
+    auto* expr = Call<vec3<bool>>(false, Call<vec2<bool>>(false, false));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1155,7 +1156,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Mat2x3_ZeroInit_f32) {
-    auto* expr = mat2x3<f32>();
+    auto* expr = Call<mat2x3<f32>>();
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1199,7 +1200,7 @@
 TEST_F(ResolverConstEvalTest, Mat2x3_ZeroInit_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* expr = mat2x3<f16>();
+    auto* expr = Call<mat2x3<f16>>();
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1241,7 +1242,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Mat3x2_Construct_Scalars_af) {
-    auto* expr = Call(ty.mat3x2<Infer>(), 1.0_a, 2.0_a, 3.0_a, 4.0_a, 5.0_a, 6.0_a);
+    auto* expr = Call<mat3x2<Infer>>(1.0_a, 2.0_a, 3.0_a, 4.0_a, 5.0_a, 6.0_a);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1283,10 +1284,10 @@
 }
 
 TEST_F(ResolverConstEvalTest, Mat3x2_Construct_Columns_af) {
-    auto* expr = Call(ty.mat<Infer>(3, 2),        //
-                      vec2<Infer>(1.0_a, 2.0_a),  //
-                      vec2<Infer>(3.0_a, 4.0_a),  //
-                      vec2<Infer>(5.0_a, 6.0_a));
+    auto* expr = Call<mat<3, 2, Infer>>(  //
+        Call<vec2<Infer>>(1.0_a, 2.0_a),  //
+        Call<vec2<Infer>>(3.0_a, 4.0_a),  //
+        Call<vec2<Infer>>(5.0_a, 6.0_a));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1328,7 +1329,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Array_i32_Zero) {
-    auto* expr = Call(ty.array<i32, 4>());
+    auto* expr = Call<array<i32, 4>>();
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1360,7 +1361,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Array_f32_Zero) {
-    auto* expr = Call(ty.array<f32, 4>());
+    auto* expr = Call<array<f32, 4>>();
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1392,7 +1393,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Array_vec3_f32_Zero) {
-    auto* expr = Call(ty.array(ty.vec3<f32>(), 2_u));
+    auto* expr = Call<array<vec3<f32>, 2>>();
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1468,7 +1469,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Array_i32_Elements) {
-    auto* expr = Call(ty.array<i32, 4>(), 10_i, 20_i, 30_i, 40_i);
+    auto* expr = Call<array<i32, 4>>(10_i, 20_i, 30_i, 40_i);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1592,7 +1593,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Array_f32_Elements) {
-    auto* expr = Call(ty.array<f32, 4>(), 10_f, 20_f, 30_f, 40_f);
+    auto* expr = Call<array<f32, 4>>(10_f, 20_f, 30_f, 40_f);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1624,8 +1625,8 @@
 }
 
 TEST_F(ResolverConstEvalTest, Array_vec3_f32_Elements) {
-    auto* expr = Call(ty.array(ty.vec3<f32>(), 2_u),  //
-                      vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(4_f, 5_f, 6_f));
+    auto* expr =
+        Call<array<vec3<f32>, 2>>(Call<vec3<f32>>(1_f, 2_f, 3_f), Call<vec3<f32>>(4_f, 5_f, 6_f));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -2083,8 +2084,8 @@
                        Member("m4", ty.vec3<f16>()),
                        Member("m5", ty.vec2<bool>()),
                    });
-    auto* expr = Call("S", vec2<i32>(1_i), vec3<u32>(2_u), vec4<f32>(3_f), vec3<f16>(4_h),
-                      vec2<bool>(false));
+    auto* expr = Call("S", Call<vec2<i32>>(1_i), Call<vec3<u32>>(2_u), Call<vec4<f32>>(3_f),
+                      Call<vec3<f16>>(4_h), Call<vec2<bool>>(false));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -2192,7 +2193,7 @@
                        Member("m2", ty.array<f32, 3>()),
                    });
     auto* expr = Call("S",  //
-                      Call(ty.array<i32, 2>(), 1_i, 2_i), Call(ty.array<f32, 3>(), 1_f, 2_f, 3_f));
+                      Call<array<i32, 2>>(1_i, 2_i), Call<array<f32, 3>>(1_f, 2_f, 3_f));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
diff --git a/src/tint/resolver/const_eval_conversion_test.cc b/src/tint/resolver/const_eval_conversion_test.cc
index 468d2b4..582ce19 100644
--- a/src/tint/resolver/const_eval_conversion_test.cc
+++ b/src/tint/resolver/const_eval_conversion_test.cc
@@ -16,7 +16,8 @@
 #include "src/tint/resolver/const_eval_test.h"
 #include "src/tint/sem/materialize.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::resolver {
 namespace {
@@ -75,7 +76,7 @@
     auto* input_val = input.Expr(*this);
     auto* expr = Call(type.ast(*this), input_val);
     if (kind == Kind::kVector) {
-        expr = Call(ty.vec<Infer>(3), expr);
+        expr = Call<vec3<Infer>>(expr);
     }
     WrapInFunction(expr);
 
@@ -225,7 +226,7 @@
                                           })));
 
 TEST_F(ResolverConstEvalTest, Vec3_Convert_f32_to_i32) {
-    auto* expr = vec3<i32>(vec3<f32>(1.1_f, 2.2_f, 3.3_f));
+    auto* expr = Call<vec3<i32>>(Call<vec3<f32>>(1.1_f, 2.2_f, 3.3_f));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -254,7 +255,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_Convert_u32_to_f32) {
-    auto* expr = vec3<f32>(vec3<u32>(10_u, 20_u, 30_u));
+    auto* expr = Call<vec3<f32>>(Call<vec3<u32>>(10_u, 20_u, 30_u));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -285,7 +286,7 @@
 TEST_F(ResolverConstEvalTest, Vec3_Convert_f16_to_i32) {
     Enable(builtin::Extension::kF16);
 
-    auto* expr = vec3<i32>(vec3<f16>(1.1_h, 2.2_h, 3.3_h));
+    auto* expr = Call<vec3<i32>>(Call<vec3<f16>>(1.1_h, 2.2_h, 3.3_h));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -316,7 +317,7 @@
 TEST_F(ResolverConstEvalTest, Vec3_Convert_u32_to_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* expr = vec3<f16>(vec3<u32>(10_u, 20_u, 30_u));
+    auto* expr = Call<vec3<f16>>(Call<vec3<u32>>(10_u, 20_u, 30_u));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -345,7 +346,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_Convert_Large_f32_to_i32) {
-    auto* expr = vec3<i32>(vec3<f32>(1e10_f, -1e20_f, 1e30_f));
+    auto* expr = Call<vec3<i32>>(Call<vec3<f32>>(1e10_f, -1e20_f, 1e30_f));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -374,7 +375,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_Convert_Large_f32_to_u32) {
-    auto* expr = vec3<u32>(vec3<f32>(1e10_f, -1e20_f, 1e30_f));
+    auto* expr = Call<vec3<u32>>(Call<vec3<f32>>(1e10_f, -1e20_f, 1e30_f));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -405,7 +406,7 @@
 TEST_F(ResolverConstEvalTest, Vec3_Convert_Large_f32_to_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* expr = vec3<f16>(Source{{12, 34}}, vec3<f32>(1e10_f, 0_f, 0_f));
+    auto* expr = Call<vec3<f16>>(Source{{12, 34}}, Call<vec3<f32>>(1e10_f, 0_f, 0_f));
     WrapInFunction(expr);
 
     EXPECT_FALSE(r()->Resolve());
@@ -415,7 +416,7 @@
 TEST_F(ResolverConstEvalTest, Vec3_Convert_Small_f32_to_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* expr = vec3<f16>(vec3<f32>(1e-20_f, -2e-30_f, 3e-40_f));
+    auto* expr = Call<vec3<f16>>(Call<vec3<f32>>(1e-20_f, -2e-30_f, 3e-40_f));
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
diff --git a/src/tint/resolver/const_eval_indexing_test.cc b/src/tint/resolver/const_eval_indexing_test.cc
index d311d30..0358d5a 100644
--- a/src/tint/resolver/const_eval_indexing_test.cc
+++ b/src/tint/resolver/const_eval_indexing_test.cc
@@ -14,13 +14,14 @@
 
 #include "src/tint/resolver/const_eval_test.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::resolver {
 namespace {
 
 TEST_F(ResolverConstEvalTest, Vec3_Index) {
-    auto* expr = IndexAccessor(vec3<i32>(1_i, 2_i, 3_i), 2_i);
+    auto* expr = IndexAccessor(Call<vec3<i32>>(1_i, 2_i, 3_i), 2_i);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -35,7 +36,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_Index_OOB_High) {
-    auto* expr = IndexAccessor(vec3<i32>(1_i, 2_i, 3_i), Expr(Source{{12, 34}}, 3_i));
+    auto* expr = IndexAccessor(Call<vec3<i32>>(1_i, 2_i, 3_i), Expr(Source{{12, 34}}, 3_i));
     WrapInFunction(expr);
 
     EXPECT_FALSE(r()->Resolve()) << r()->error();
@@ -43,7 +44,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_Index_OOB_Low) {
-    auto* expr = IndexAccessor(vec3<i32>(1_i, 2_i, 3_i), Expr(Source{{12, 34}}, -3_i));
+    auto* expr = IndexAccessor(Call<vec3<i32>>(1_i, 2_i, 3_i), Expr(Source{{12, 34}}, -3_i));
     WrapInFunction(expr);
 
     EXPECT_FALSE(r()->Resolve()) << r()->error();
@@ -123,7 +124,7 @@
 }  // namespace Swizzle
 
 TEST_F(ResolverConstEvalTest, Vec3_Swizzle_Scalar) {
-    auto* expr = MemberAccessor(vec3<i32>(1_i, 2_i, 3_i), "y");
+    auto* expr = MemberAccessor(Call<vec3<i32>>(1_i, 2_i, 3_i), "y");
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -138,7 +139,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, Vec3_Swizzle_Vector) {
-    auto* expr = MemberAccessor(vec3<i32>(1_i, 2_i, 3_i), "zx");
+    auto* expr = MemberAccessor(Call<vec3<i32>>(1_i, 2_i, 3_i), "zx");
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -161,7 +162,8 @@
 
 TEST_F(ResolverConstEvalTest, Vec3_Swizzle_Chain) {
     auto* expr =  // (1, 2, 3) -> (2, 3, 1) -> (3, 2) -> 2
-        MemberAccessor(MemberAccessor(MemberAccessor(vec3<i32>(1_i, 2_i, 3_i), "gbr"), "yx"), "y");
+        MemberAccessor(MemberAccessor(MemberAccessor(Call<vec3<i32>>(1_i, 2_i, 3_i), "gbr"), "yx"),
+                       "y");
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -176,8 +178,10 @@
 }
 
 TEST_F(ResolverConstEvalTest, Mat3x2_Index) {
-    auto* expr = IndexAccessor(
-        mat3x2<f32>(vec2<f32>(1._a, 2._a), vec2<f32>(3._a, 4._a), vec2<f32>(5._a, 6._a)), 2_i);
+    auto* expr =
+        IndexAccessor(Call<mat3x2<f32>>(Call<vec2<f32>>(1._a, 2._a), Call<vec2<f32>>(3._a, 4._a),
+                                        Call<vec2<f32>>(5._a, 6._a)),
+                      2_i);
     WrapInFunction(expr);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -199,9 +203,10 @@
 }
 
 TEST_F(ResolverConstEvalTest, Mat3x2_Index_OOB_High) {
-    auto* expr = IndexAccessor(
-        mat3x2<f32>(vec2<f32>(1._a, 2._a), vec2<f32>(3._a, 4._a), vec2<f32>(5._a, 6._a)),
-        Expr(Source{{12, 34}}, 3_i));
+    auto* expr =
+        IndexAccessor(Call<mat3x2<f32>>(Call<vec2<f32>>(1._a, 2._a), Call<vec2<f32>>(3._a, 4._a),
+                                        Call<vec2<f32>>(5._a, 6._a)),
+                      Expr(Source{{12, 34}}, 3_i));
     WrapInFunction(expr);
 
     EXPECT_FALSE(r()->Resolve()) << r()->error();
@@ -209,9 +214,10 @@
 }
 
 TEST_F(ResolverConstEvalTest, Mat3x2_Index_OOB_Low) {
-    auto* expr = IndexAccessor(
-        mat3x2<f32>(vec2<f32>(1._a, 2._a), vec2<f32>(3._a, 4._a), vec2<f32>(5._a, 6._a)),
-        Expr(Source{{12, 34}}, -3_i));
+    auto* expr =
+        IndexAccessor(Call<mat3x2<f32>>(Call<vec2<f32>>(1._a, 2._a), Call<vec2<f32>>(3._a, 4._a),
+                                        Call<vec2<f32>>(5._a, 6._a)),
+                      Expr(Source{{12, 34}}, -3_i));
     WrapInFunction(expr);
 
     EXPECT_FALSE(r()->Resolve()) << r()->error();
@@ -219,8 +225,9 @@
 }
 
 TEST_F(ResolverConstEvalTest, Array_vec3_f32_Index) {
-    auto* expr = IndexAccessor(Call(ty.array(ty.vec3<f32>(), 2_u),  //
-                                    vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(4_f, 5_f, 6_f)),
+    auto* expr = IndexAccessor(Call<array<vec3<f32>, 2>>(           //
+                                   Call<vec3<f32>>(1_f, 2_f, 3_f),  //
+                                   Call<vec3<f32>>(4_f, 5_f, 6_f)),
                                1_i);
     WrapInFunction(expr);
 
@@ -248,8 +255,9 @@
 }
 
 TEST_F(ResolverConstEvalTest, Array_vec3_f32_Index_OOB_High) {
-    auto* expr = IndexAccessor(Call(ty.array(ty.vec3<f32>(), 2_u),  //
-                                    vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(4_f, 5_f, 6_f)),
+    auto* expr = IndexAccessor(Call<array<vec3<f32>, 2>>(           //
+                                   Call<vec3<f32>>(1_f, 2_f, 3_f),  //
+                                   Call<vec3<f32>>(4_f, 5_f, 6_f)),
                                Expr(Source{{12, 34}}, 2_i));
     WrapInFunction(expr);
 
@@ -258,8 +266,9 @@
 }
 
 TEST_F(ResolverConstEvalTest, Array_vec3_f32_Index_OOB_Low) {
-    auto* expr = IndexAccessor(Call(ty.array(ty.vec3<f32>(), 2_u),  //
-                                    vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(4_f, 5_f, 6_f)),
+    auto* expr = IndexAccessor(Call<array<vec3<f32>, 2>>(           //
+                                   Call<vec3<f32>>(1_f, 2_f, 3_f),  //
+                                   Call<vec3<f32>>(4_f, 5_f, 6_f)),
                                Expr(Source{{12, 34}}, -2_i));
     WrapInFunction(expr);
 
@@ -268,7 +277,7 @@
 }
 
 TEST_F(ResolverConstEvalTest, RuntimeArray_vec3_f32_Index_OOB_Low) {
-    auto* sb = GlobalVar("sb", ty.array(ty.vec3<f32>()), Group(0_a), Binding(0_a),
+    auto* sb = GlobalVar("sb", ty.array<vec3<f32>>(), Group(0_a), Binding(0_a),
                          builtin::AddressSpace::kStorage);
     auto* expr = IndexAccessor(sb, Expr(Source{{12, 34}}, -2_i));
     WrapInFunction(expr);
@@ -278,11 +287,11 @@
 }
 
 TEST_F(ResolverConstEvalTest, ChainedIndex) {
-    auto* arr_expr = Call(ty.array(ty.mat2x3<f32>(), 2_u),        // array<mat2x3<f32>, 2u>
-                          mat2x3<f32>(vec3<f32>(1_f, 2_f, 3_f),   //
-                                      vec3<f32>(4_f, 5_f, 6_f)),  //
-                          mat2x3<f32>(vec3<f32>(7_f, 0_f, 9_f),   //
-                                      vec3<f32>(10_f, 11_f, 12_f)));
+    auto* arr_expr = Call<array<mat2x3<f32>, 2>>(           //
+        Call<mat2x3<f32>>(Call<vec3<f32>>(1_f, 2_f, 3_f),   //
+                          Call<vec3<f32>>(4_f, 5_f, 6_f)),  //
+        Call<mat2x3<f32>>(Call<vec3<f32>>(7_f, 0_f, 9_f),   //
+                          Call<vec3<f32>>(10_f, 11_f, 12_f)));
 
     auto* mat_expr = IndexAccessor(arr_expr, 1_i);  // arr[1]
     auto* vec_expr = IndexAccessor(mat_expr, 0_i);  // arr[1][0]
diff --git a/src/tint/resolver/const_eval_member_access_test.cc b/src/tint/resolver/const_eval_member_access_test.cc
index ee92714..49b8e8c 100644
--- a/src/tint/resolver/const_eval_member_access_test.cc
+++ b/src/tint/resolver/const_eval_member_access_test.cc
@@ -14,7 +14,8 @@
 
 #include "src/tint/resolver/const_eval_test.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::resolver {
 namespace {
@@ -68,9 +69,9 @@
 }
 
 TEST_F(ResolverConstEvalTest, Matrix_AFloat_Construct_From_AInt_Vectors) {
-    auto* c = Const("a", Call(ty.mat2x2<Infer>(),  //
-                              Call(ty.vec<Infer>(2), Expr(1_a), Expr(2_a)),
-                              Call(ty.vec<Infer>(2), Expr(3_a), Expr(4_a))));
+    auto* c = Const("a", Call<mat2x2<Infer>>(              //
+                             Call<vec2<Infer>>(1_a, 2_a),  //
+                             Call<vec2<Infer>>(3_a, 4_a)));
     WrapInFunction(c);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -93,18 +94,18 @@
 }
 
 TEST_F(ResolverConstEvalTest, MatrixMemberAccess_AFloat) {
-    auto* c = Const("a", Call(ty.mat2x3<Infer>(),  //
-                              Call(ty.vec3<Infer>(), Expr(1.0_a), Expr(2.0_a), Expr(3.0_a)),
-                              Call(ty.vec3<Infer>(), Expr(4.0_a), Expr(5.0_a), Expr(6.0_a))));
+    auto* c = Const("a", Call<mat2x3<Infer>>(                         //
+                             Call<vec3<Infer>>(1.0_a, 2.0_a, 3.0_a),  //
+                             Call<vec3<Infer>>(4.0_a, 5.0_a, 6.0_a)));
 
-    auto* col_0 = Const("col_0", IndexAccessor("a", Expr(0_i)));
-    auto* col_1 = Const("col_1", IndexAccessor("a", Expr(1_i)));
-    auto* e00 = Const("e00", IndexAccessor("col_0", Expr(0_i)));
-    auto* e01 = Const("e01", IndexAccessor("col_0", Expr(1_i)));
-    auto* e02 = Const("e02", IndexAccessor("col_0", Expr(2_i)));
-    auto* e10 = Const("e10", IndexAccessor("col_1", Expr(0_i)));
-    auto* e11 = Const("e11", IndexAccessor("col_1", Expr(1_i)));
-    auto* e12 = Const("e12", IndexAccessor("col_1", Expr(2_i)));
+    auto* col_0 = Const("col_0", IndexAccessor("a", 0_i));
+    auto* col_1 = Const("col_1", IndexAccessor("a", 1_i));
+    auto* e00 = Const("e00", IndexAccessor("col_0", 0_i));
+    auto* e01 = Const("e01", IndexAccessor("col_0", 1_i));
+    auto* e02 = Const("e02", IndexAccessor("col_0", 2_i));
+    auto* e10 = Const("e10", IndexAccessor("col_1", 0_i));
+    auto* e11 = Const("e11", IndexAccessor("col_1", 1_i));
+    auto* e12 = Const("e12", IndexAccessor("col_1", 2_i));
 
     (void)col_0;
     (void)col_1;
@@ -169,18 +170,18 @@
 }
 
 TEST_F(ResolverConstEvalTest, MatrixMemberAccess_f32) {
-    auto* c = Const("a", Call(ty.mat2x3<Infer>(),  //
-                              Call(ty.vec3<Infer>(), Expr(1.0_f), Expr(2.0_f), Expr(3.0_f)),
-                              Call(ty.vec3<Infer>(), Expr(4.0_f), Expr(5.0_f), Expr(6.0_f))));
+    auto* c = Const("a", Call<mat2x3<Infer>>(                         //
+                             Call<vec3<Infer>>(1.0_f, 2.0_f, 3.0_f),  //
+                             Call<vec3<Infer>>(4.0_f, 5.0_f, 6.0_f)));
 
-    auto* col_0 = Const("col_0", IndexAccessor("a", Expr(0_i)));
-    auto* col_1 = Const("col_1", IndexAccessor("a", Expr(1_i)));
-    auto* e00 = Const("e00", IndexAccessor("col_0", Expr(0_i)));
-    auto* e01 = Const("e01", IndexAccessor("col_0", Expr(1_i)));
-    auto* e02 = Const("e02", IndexAccessor("col_0", Expr(2_i)));
-    auto* e10 = Const("e10", IndexAccessor("col_1", Expr(0_i)));
-    auto* e11 = Const("e11", IndexAccessor("col_1", Expr(1_i)));
-    auto* e12 = Const("e12", IndexAccessor("col_1", Expr(2_i)));
+    auto* col_0 = Const("col_0", IndexAccessor("a", 0_i));
+    auto* col_1 = Const("col_1", IndexAccessor("a", 1_i));
+    auto* e00 = Const("e00", IndexAccessor("col_0", 0_i));
+    auto* e01 = Const("e01", IndexAccessor("col_0", 1_i));
+    auto* e02 = Const("e02", IndexAccessor("col_0", 2_i));
+    auto* e10 = Const("e10", IndexAccessor("col_1", 0_i));
+    auto* e11 = Const("e11", IndexAccessor("col_1", 1_i));
+    auto* e12 = Const("e12", IndexAccessor("col_1", 2_i));
 
     (void)col_0;
     (void)col_1;
diff --git a/src/tint/resolver/dependency_graph_test.cc b/src/tint/resolver/dependency_graph_test.cc
index ee509a7..49856fd 100644
--- a/src/tint/resolver/dependency_graph_test.cc
+++ b/src/tint/resolver/dependency_graph_test.cc
@@ -23,7 +23,8 @@
 #include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/transform.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::resolver {
 namespace {
@@ -1732,7 +1733,7 @@
     GlobalVar(Sym(), ty.array(T, V));
     GlobalVar(Sym(), ty.vec3(T));
     GlobalVar(Sym(), ty.mat3x2(T));
-    GlobalVar(Sym(), ty.ptr(builtin::AddressSpace::kPrivate, T));
+    GlobalVar(Sym(), ty.ptr<private_>(T));
     GlobalVar(Sym(), ty.sampled_texture(type::TextureDimension::k2d, T));
     GlobalVar(Sym(), ty.depth_texture(type::TextureDimension::k2d));
     GlobalVar(Sym(), ty.depth_multisampled_texture(type::TextureDimension::k2d));
diff --git a/src/tint/resolver/entry_point_validation_test.cc b/src/tint/resolver/entry_point_validation_test.cc
index eb2d779..4da98db 100644
--- a/src/tint/resolver/entry_point_validation_test.cc
+++ b/src/tint/resolver/entry_point_validation_test.cc
@@ -22,27 +22,16 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 // Helpers and typedefs
 template <typename T>
 using DataType = builder::DataType<T>;
 template <typename T>
-using vec2 = builder::vec2<T>;
-template <typename T>
-using vec3 = builder::vec3<T>;
-template <typename T>
-using vec4 = builder::vec4<T>;
-template <typename T>
-using mat2x2 = builder::mat2x2<T>;
-template <typename T>
-using mat3x3 = builder::mat3x3<T>;
-template <typename T>
-using mat4x4 = builder::mat4x4<T>;
-template <typename T>
 using alias = builder::alias<T>;
 
 class ResolverEntryPointValidationTest : public TestHelper, public testing::Test {};
@@ -69,7 +58,7 @@
     // fn main() -> @builtin(position) vec4<f32> { return vec4<f32>(); }
     Func(Source{{12, 34}}, "main", utils::Empty, ty.vec4<f32>(),
          utils::Vector{
-             Return(Call(ty.vec4<f32>())),
+             Return(Call<vec4<f32>>()),
          },
          utils::Vector{
              Stage(ast::PipelineStage::kVertex),
@@ -88,7 +77,7 @@
     // }
     Func(Source{{12, 34}}, "main", utils::Empty, ty.vec4<f32>(),
          utils::Vector{
-             Return(Call(ty.vec4<f32>())),
+             Return(Call<vec4<f32>>()),
          },
          utils::Vector{
              Stage(ast::PipelineStage::kVertex),
@@ -105,7 +94,7 @@
     // }
     Func(Source{{12, 34}}, "main", utils::Empty, ty.vec4<f32>(),
          utils::Vector{
-             Return(Call(ty.vec4<f32>())),
+             Return(Call<vec4<f32>>()),
          },
          utils::Vector{
              Stage(ast::PipelineStage::kVertex),
@@ -793,7 +782,7 @@
 
     Func(Source{{12, 34}}, "frag_main", utils::Empty, ty.array<f32, 2>(),
          utils::Vector{
-             Return(Call(ty.array<f32, 2>())),
+             Return(Call<array<f32, 2>>()),
          },
          utils::Vector{
              Stage(ast::PipelineStage::kFragment),
diff --git a/src/tint/resolver/evaluation_stage_test.cc b/src/tint/resolver/evaluation_stage_test.cc
index 2e148e5..c9c9e97 100644
--- a/src/tint/resolver/evaluation_stage_test.cc
+++ b/src/tint/resolver/evaluation_stage_test.cc
@@ -17,11 +17,12 @@
 #include "gmock/gmock.h"
 #include "src/tint/resolver/resolver_test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using ResolverEvaluationStageTest = ResolverTest;
 
 TEST_F(ResolverEvaluationStageTest, Literal_i32) {
@@ -41,7 +42,7 @@
 }
 
 TEST_F(ResolverEvaluationStageTest, Vector_Init) {
-    auto* expr = vec3<f32>();
+    auto* expr = Call<vec3<f32>>();
     WrapInFunction(expr);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -52,7 +53,7 @@
     // const f = 1.f;
     // vec2<f32>(f, f);
     auto* f = Const("f", Expr(1_f));
-    auto* expr = vec2<f32>(f, f);
+    auto* expr = Call<vec2<f32>>(f, f);
     WrapInFunction(f, expr);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -64,7 +65,7 @@
     // var f = 1.f;
     // vec2<f32>(f, f);
     auto* f = Var("f", Expr(1_f));
-    auto* expr = vec2<f32>(f, f);
+    auto* expr = Call<vec2<f32>>(f, f);
     WrapInFunction(f, expr);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -76,7 +77,7 @@
     // const f = 1.f;
     // vec2<u32>(vec2<f32>(f));
     auto* f = Const("f", Expr(1_f));
-    auto* expr = vec2<u32>(vec2<f32>(f));
+    auto* expr = Call<vec2<u32>>(Call<vec2<f32>>(f));
     WrapInFunction(f, expr);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -88,7 +89,7 @@
     // var f = 1.f;
     // vec2<u32>(vec2<f32>(f));
     auto* f = Var("f", Expr(1_f));
-    auto* expr = vec2<u32>(vec2<f32>(f));
+    auto* expr = Call<vec2<u32>>(Call<vec2<f32>>(f));
     WrapInFunction(f, expr);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -97,7 +98,7 @@
 }
 
 TEST_F(ResolverEvaluationStageTest, Matrix_Init) {
-    auto* expr = mat2x2<f32>();
+    auto* expr = Call<mat2x2<f32>>();
     WrapInFunction(expr);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -105,7 +106,7 @@
 }
 
 TEST_F(ResolverEvaluationStageTest, Array_Init) {
-    auto* expr = array<f32, 3>();
+    auto* expr = Call<array<f32, 3>>();
     WrapInFunction(expr);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -116,7 +117,7 @@
     // const f = 1.f;
     // array<f32, 2>(f, f);
     auto* f = Const("f", Expr(1_f));
-    auto* expr = Call(ty.array<f32, 2>(), f, f);
+    auto* expr = Call<array<f32, 2>>(f, f);
     WrapInFunction(f, expr);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -130,7 +131,7 @@
     // array<f32, 2>(f1, f2);
     auto* f1 = Const("f1", Expr(1_f));
     auto* f2 = Override("f2", Expr(2_f));
-    auto* expr = Call(ty.array<f32, 2>(), f1, f2);
+    auto* expr = Call<array<f32, 2>>(f1, f2);
     WrapInFunction(f1, expr);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -145,7 +146,7 @@
     // array<f32, 2>(f1, f2);
     auto* f1 = Override("f1", Expr(1_f));
     auto* f2 = Var("f2", Expr(2_f));
-    auto* expr = Call(ty.array<f32, 2>(), f1, f2);
+    auto* expr = Call<array<f32, 2>>(f1, f2);
     WrapInFunction(f2, expr);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -160,7 +161,7 @@
     // array<f32, 2>(f1, f2);
     auto* f1 = Const("f1", Expr(1_f));
     auto* f2 = Var("f2", Expr(2_f));
-    auto* expr = Call(ty.array<f32, 2>(), f1, f2);
+    auto* expr = Call<array<f32, 2>>(f1, f2);
     WrapInFunction(f1, f2, expr);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -173,7 +174,7 @@
     // var f = 1.f;
     // array<f32, 2>(f, f);
     auto* f = Var("f", Expr(1_f));
-    auto* expr = Call(ty.array<f32, 2>(), f, f);
+    auto* expr = Call<array<f32, 2>>(f, f);
     WrapInFunction(f, expr);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -185,7 +186,7 @@
     // const vec = vec4<f32>();
     // const idx = 1_i;
     // vec[idx]
-    auto* vec = Const("vec", vec4<f32>());
+    auto* vec = Const("vec", Call<vec4<f32>>());
     auto* idx = Const("idx", Expr(1_i));
     auto* expr = IndexAccessor(vec, idx);
     WrapInFunction(vec, idx, expr);
@@ -200,7 +201,7 @@
     // var vec = vec4<f32>();
     // const idx = 1_i;
     // vec[idx]
-    auto* vec = Var("vec", vec4<f32>());
+    auto* vec = Var("vec", Call<vec4<f32>>());
     auto* idx = Const("idx", Expr(1_i));
     auto* expr = IndexAccessor(vec, idx);
     WrapInFunction(vec, idx, expr);
@@ -215,7 +216,7 @@
     // const vec = vec4<f32>();
     // override idx = 1_i;
     // vec[idx]
-    auto* vec = Const("vec", vec4<f32>());
+    auto* vec = Const("vec", Call<vec4<f32>>());
     auto* idx = Override("idx", Expr(1_i));
     auto* expr = IndexAccessor(vec, idx);
     WrapInFunction(vec, expr);
@@ -230,7 +231,7 @@
     // const vec = vec4<f32>();
     // let idx = 1_i;
     // vec[idx]
-    auto* vec = Const("vec", vec4<f32>());
+    auto* vec = Const("vec", Call<vec4<f32>>());
     auto* idx = Let("idx", Expr(1_i));
     auto* expr = IndexAccessor(vec, idx);
     WrapInFunction(vec, idx, expr);
@@ -244,7 +245,7 @@
 TEST_F(ResolverEvaluationStageTest, Swizzle_Const) {
     // const vec = S();
     // vec.m
-    auto* vec = Const("vec", vec4<f32>());
+    auto* vec = Const("vec", Call<vec4<f32>>());
     auto* expr = MemberAccessor(vec, "xz");
     WrapInFunction(vec, expr);
 
@@ -256,7 +257,7 @@
 TEST_F(ResolverEvaluationStageTest, Swizzle_Runtime) {
     // var vec = S();
     // vec.m
-    auto* vec = Var("vec", vec4<f32>());
+    auto* vec = Var("vec", Call<vec4<f32>>());
     auto* expr = MemberAccessor(vec, "rg");
     WrapInFunction(vec, expr);
 
diff --git a/src/tint/resolver/f16_extension_test.cc b/src/tint/resolver/f16_extension_test.cc
index 0868208..8e4ad02 100644
--- a/src/tint/resolver/f16_extension_test.cc
+++ b/src/tint/resolver/f16_extension_test.cc
@@ -17,11 +17,12 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using ResolverF16ExtensionTest = ResolverTest;
 
 TEST_F(ResolverF16ExtensionTest, TypeUsedWithExtension) {
@@ -65,7 +66,7 @@
     // var<private> v = vec2<f16>();
     Enable(builtin::Extension::kF16);
 
-    GlobalVar("v", vec2<f16>(), builtin::AddressSpace::kPrivate);
+    GlobalVar("v", Call<vec2<f16>>(), builtin::AddressSpace::kPrivate);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -83,14 +84,15 @@
     // var<private> v = vec2<f16>(vec2<f32>());
     Enable(builtin::Extension::kF16);
 
-    GlobalVar("v", vec2<f16>(vec2<f32>()), builtin::AddressSpace::kPrivate);
+    GlobalVar("v", Call<vec2<f16>>(Call<vec2<f32>>()), builtin::AddressSpace::kPrivate);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverF16ExtensionTest, Vec2TypeConvUsedWithoutExtension) {
     // var<private> v = vec2<f16>(vec2<f32>());
-    GlobalVar("v", vec2(ty.f16(Source{{12, 34}}), vec2<f32>()), builtin::AddressSpace::kPrivate);
+    GlobalVar("v", Call(ty.vec2(ty.f16(Source{{12, 34}})), Call<vec2<f32>>()),
+              builtin::AddressSpace::kPrivate);
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(), "12:34 error: f16 type used without 'f16' extension enabled");
diff --git a/src/tint/resolver/function_validation_test.cc b/src/tint/resolver/function_validation_test.cc
index b97e7f3..cc5f746 100644
--- a/src/tint/resolver/function_validation_test.cc
+++ b/src/tint/resolver/function_validation_test.cc
@@ -22,7 +22,8 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::resolver {
 namespace {
@@ -187,7 +188,7 @@
     Func(Source{{1, 2}}, "func", utils::Empty, ty.vec4<f32>(),
          utils::Vector{
              Discard(Source{{12, 34}}),
-             Return(Call(ty.vec4<f32>())),
+             Return(Call<vec4<f32>>()),
          },
          utils::Vector{Stage(ast::PipelineStage::kVertex)},
          utils::Vector{Builtin(builtin::BuiltinValue::kPosition)});
@@ -926,7 +927,7 @@
 }
 
 TEST_F(ResolverFunctionValidationTest, ReturnIsConstructible_NonPlain) {
-    auto ret_type = ty.ptr(Source{{12, 34}}, builtin::AddressSpace::kFunction, ty.i32());
+    auto ret_type = ty.ptr<function, i32>(Source{{12, 34}});
     Func("f", utils::Empty, ret_type, utils::Empty);
 
     EXPECT_FALSE(r()->Resolve());
diff --git a/src/tint/resolver/increment_decrement_validation_test.cc b/src/tint/resolver/increment_decrement_validation_test.cc
index c3a0c78..b0ce2e3 100644
--- a/src/tint/resolver/increment_decrement_validation_test.cc
+++ b/src/tint/resolver/increment_decrement_validation_test.cc
@@ -17,11 +17,12 @@
 #include "gmock/gmock.h"
 #include "src/tint/resolver/resolver_test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using ResolverIncrementDecrementValidationTest = ResolverTest;
 
 TEST_F(ResolverIncrementDecrementValidationTest, Increment_Signed) {
@@ -65,7 +66,7 @@
     // let b : ptr<function,i32> = &a;
     // *b++;
     auto* var_a = Var("a", ty.i32(), builtin::AddressSpace::kFunction);
-    auto* var_b = Let("b", ty.ptr<i32>(builtin::AddressSpace::kFunction), AddressOf(Expr("a")));
+    auto* var_b = Let("b", ty.ptr<function, i32>(), AddressOf(Expr("a")));
     WrapInFunction(var_a, var_b, Increment(Source{{12, 34}}, Deref("b")));
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
diff --git a/src/tint/resolver/inferred_type_test.cc b/src/tint/resolver/inferred_type_test.cc
index 4545419..b6b5481 100644
--- a/src/tint/resolver/inferred_type_test.cc
+++ b/src/tint/resolver/inferred_type_test.cc
@@ -17,27 +17,16 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 // Helpers and typedefs
 template <typename T>
 using DataType = builder::DataType<T>;
 template <typename T>
-using vec2 = builder::vec2<T>;
-template <typename T>
-using vec3 = builder::vec3<T>;
-template <typename T>
-using vec4 = builder::vec4<T>;
-template <typename T>
-using mat2x2 = builder::mat2x2<T>;
-template <typename T>
-using mat3x3 = builder::mat3x3<T>;
-template <typename T>
-using mat4x4 = builder::mat4x4<T>;
-template <typename T>
 using alias = builder::alias<T>;
 
 struct ResolverInferredTypeTest : public resolver::TestHelper, public testing::Test {};
diff --git a/src/tint/resolver/intrinsic_table_test.cc b/src/tint/resolver/intrinsic_table_test.cc
index 1d5627c..7b658ad8 100644
--- a/src/tint/resolver/intrinsic_table_test.cc
+++ b/src/tint/resolver/intrinsic_table_test.cc
@@ -36,15 +36,16 @@
 namespace {
 
 using ::testing::HasSubstr;
+using namespace tint::builtin::fluent_types;  // NOLINT
 
 using Parameter = sem::Parameter;
 using ParameterUsage = sem::ParameterUsage;
 
-using AFloatV = builder::vec<3, AFloat>;
-using AIntV = builder::vec<3, AInt>;
-using f32V = builder::vec<3, f32>;
-using i32V = builder::vec<3, i32>;
-using u32V = builder::vec<3, u32>;
+using AFloatV = vec3<AFloat>;
+using AIntV = vec3<AInt>;
+using f32V = vec3<f32>;
+using i32V = vec3<i32>;
+using u32V = vec3<u32>;
 
 class IntrinsicTableTest : public testing::Test, public ProgramBuilder {
   public:
diff --git a/src/tint/resolver/is_storeable_test.cc b/src/tint/resolver/is_storeable_test.cc
index 65c1ab9..b7fa0e8 100644
--- a/src/tint/resolver/is_storeable_test.cc
+++ b/src/tint/resolver/is_storeable_test.cc
@@ -18,6 +18,8 @@
 #include "src/tint/resolver/resolver_test_helper.h"
 #include "src/tint/type/atomic.h"
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+
 namespace tint::resolver {
 namespace {
 
@@ -112,7 +114,7 @@
 TEST_F(ResolverIsStorableTest, Struct_SomeMembersNonStorable) {
     Structure("S", utils::Vector{
                        Member("a", ty.i32()),
-                       Member("b", ty.ptr<i32>(builtin::AddressSpace::kPrivate)),
+                       Member("b", ty.ptr<private_, i32>()),
                    });
 
     EXPECT_FALSE(r()->Resolve());
@@ -135,11 +137,10 @@
 }
 
 TEST_F(ResolverIsStorableTest, Struct_NestedNonStorable) {
-    auto* non_storable =
-        Structure("nonstorable", utils::Vector{
-                                     Member("a", ty.i32()),
-                                     Member("b", ty.ptr<i32>(builtin::AddressSpace::kPrivate)),
-                                 });
+    auto* non_storable = Structure("nonstorable", utils::Vector{
+                                                      Member("a", ty.i32()),
+                                                      Member("b", ty.ptr<private_, i32>()),
+                                                  });
     Structure("S", utils::Vector{
                        Member("a", ty.i32()),
                        Member("b", ty.Of(non_storable)),
diff --git a/src/tint/resolver/load_test.cc b/src/tint/resolver/load_test.cc
index 2334227..48b9886 100644
--- a/src/tint/resolver/load_test.cc
+++ b/src/tint/resolver/load_test.cc
@@ -20,11 +20,12 @@
 #include "src/tint/type/reference.h"
 #include "src/tint/type/texture_dimension.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using ResolverLoadTest = ResolverTest;
 
 TEST_F(ResolverLoadTest, VarInitializer) {
@@ -140,7 +141,7 @@
     // var v = array<i32, 3>(1i, 2i, 3i)[ref];
     auto* ident = Expr("ref");
     WrapInFunction(Var("ref", Expr(1_i)),  //
-                   IndexAccessor(array<i32, 3>(1_i, 2_i, 3_i), ident));
+                   IndexAccessor(Call<array<i32, 3>>(1_i, 2_i, 3_i), ident));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* load = Sem().Get<sem::Load>(ident);
@@ -154,7 +155,7 @@
     // var ref = vec4(1);
     // var v = ref.xyz;
     auto* ident = Expr("ref");
-    WrapInFunction(Var("ref", vec4<i32>(1_i)),  //
+    WrapInFunction(Var("ref", Call<vec4<i32>>(1_i)),  //
                    Var("v", MemberAccessor(ident, "xyz")));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -230,7 +231,7 @@
          },
          ty.vec4<f32>(),
          utils::Vector{
-             Return(Call("textureSampleLevel", "tp", "sp", vec2<f32>(), 0_a)),
+             Return(Call("textureSampleLevel", "tp", "sp", Call<vec2<f32>>(), 0_a)),
          });
     auto* t_ident = Expr("t");
     auto* s_ident = Expr("s");
diff --git a/src/tint/resolver/materialize_test.cc b/src/tint/resolver/materialize_test.cc
index cf67c93..7a45bf8 100644
--- a/src/tint/resolver/materialize_test.cc
+++ b/src/tint/resolver/materialize_test.cc
@@ -21,26 +21,27 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
-using AFloatV = builder::vec<3, AFloat>;
-using AFloatM = builder::mat<3, 2, AFloat>;
-using AFloatA = builder::array<3, AFloat>;
-using AIntV = builder::vec<3, AInt>;
-using AIntA = builder::array<3, AInt>;
-using f32V = builder::vec<3, f32>;
-using f16V = builder::vec<3, f16>;
-using i32V = builder::vec<3, i32>;
-using u32V = builder::vec<3, u32>;
-using f32M = builder::mat<3, 2, f32>;
-using f16M = builder::mat<3, 2, f16>;
-using f32A = builder::array<3, f32>;
-using f16A = builder::array<3, f16>;
-using i32A = builder::array<3, i32>;
-using u32A = builder::array<3, u32>;
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
+using AFloatV = vec3<AFloat>;
+using AFloatM = mat3x2<AFloat>;
+using AFloatA = array<AFloat, 3>;
+using AIntV = vec3<AInt>;
+using AIntA = array<AInt, 3>;
+using f32V = vec3<f32>;
+using f16V = vec3<f16>;
+using i32V = vec3<i32>;
+using u32V = vec3<u32>;
+using f32M = mat3x2<f32>;
+using f16M = mat3x2<f16>;
+using f32A = array<f32, 3>;
+using f16A = array<f16, 3>;
+using i32A = array<i32, 3>;
+using u32A = array<u32, 3>;
 
 constexpr double kTooBigF32 = static_cast<double>(3.5e+38);
 constexpr double kTooBigF16 = static_cast<double>(6.6e+4);
@@ -1276,7 +1277,7 @@
 
 TEST_F(MaterializeAbstractStructure, Modf_Vector_DefaultType) {
     // var v = modf(vec2(1));
-    auto* call = Call("modf", Call(ty.vec2<Infer>(), 1_a));
+    auto* call = Call("modf", Call<vec2<Infer>>(1_a));
     WrapInFunction(Decl(Var("v", call)));
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* sem = Sem().Get(call);
@@ -1316,8 +1317,8 @@
     // var v = modf(vec2(1_h)); // v is __modf_result_vec2_f16
     // v = modf(vec2(1));       // __modf_result_vec2_f16 <- __modf_result_vec2_abstract
     Enable(builtin::Extension::kF16);
-    auto* call = Call("modf", Call(ty.vec2<Infer>(), 1_a));
-    WrapInFunction(Decl(Var("v", Call("modf", Call(ty.vec2<Infer>(), 1_h)))), Assign("v", call));
+    auto* call = Call("modf", Call<vec2<Infer>>(1_a));
+    WrapInFunction(Decl(Var("v", Call("modf", Call<vec2<Infer>>(1_h)))), Assign("v", call));
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* sem = Sem().Get(call);
     ASSERT_TRUE(sem->Is<sem::Materialize>());
@@ -1353,7 +1354,7 @@
 
 TEST_F(MaterializeAbstractStructure, Frexp_Vector_DefaultType) {
     // var v = frexp(vec2(1));
-    auto* call = Call("frexp", Call(ty.vec2<Infer>(), 1_a));
+    auto* call = Call("frexp", Call<vec2<Infer>>(1_a));
     WrapInFunction(Decl(Var("v", call)));
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* sem = Sem().Get(call);
@@ -1399,8 +1400,8 @@
     // var v = frexp(vec2(1_h)); // v is __frexp_result_vec2_f16
     // v = frexp(vec2(1));       // __frexp_result_vec2_f16 <- __frexp_result_vec2_abstract
     Enable(builtin::Extension::kF16);
-    auto* call = Call("frexp", Call(ty.vec2<Infer>(), 1_a));
-    WrapInFunction(Decl(Var("v", Call("frexp", Call(ty.vec2<Infer>(), 1_h)))), Assign("v", call));
+    auto* call = Call("frexp", Call<vec2<Infer>>(1_a));
+    WrapInFunction(Decl(Var("v", Call("frexp", Call<vec2<Infer>>(1_h)))), Assign("v", call));
     ASSERT_TRUE(r()->Resolve()) << r()->error();
     auto* sem = Sem().Get(call);
     ASSERT_TRUE(sem->Is<sem::Materialize>());
diff --git a/src/tint/resolver/ptr_ref_validation_test.cc b/src/tint/resolver/ptr_ref_validation_test.cc
index f6da233..2da5cf0 100644
--- a/src/tint/resolver/ptr_ref_validation_test.cc
+++ b/src/tint/resolver/ptr_ref_validation_test.cc
@@ -19,11 +19,12 @@
 #include "src/tint/type/reference.h"
 #include "src/tint/type/texture_dimension.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 struct ResolverPtrRefValidationTest : public resolver::TestHelper, public testing::Test {};
 
 TEST_F(ResolverPtrRefValidationTest, AddressOfLiteral) {
@@ -143,12 +144,11 @@
     // }
     auto* inner = Structure("Inner", utils::Vector{Member("arr", ty.array<i32, 4>())});
     auto* buf = Structure("S", utils::Vector{Member("inner", ty.Of(inner))});
-    auto* storage = GlobalVar("s", ty.Of(buf), builtin::AddressSpace::kStorage,
-                              builtin::Access::kReadWrite, Binding(0_a), Group(0_a));
+    auto* var = GlobalVar("s", ty.Of(buf), builtin::AddressSpace::kStorage,
+                          builtin::Access::kReadWrite, Binding(0_a), Group(0_a));
 
-    auto* expr = IndexAccessor(MemberAccessor(MemberAccessor(storage, "inner"), "arr"), 2_i);
-    auto* ptr =
-        Let(Source{{12, 34}}, "p", ty.ptr<i32>(builtin::AddressSpace::kStorage), AddressOf(expr));
+    auto* expr = IndexAccessor(MemberAccessor(MemberAccessor(var, "inner"), "arr"), 2_i);
+    auto* ptr = Let(Source{{12, 34}}, "p", ty.ptr<storage, i32>(), AddressOf(expr));
 
     WrapInFunction(ptr);
 
diff --git a/src/tint/resolver/resolver_behavior_test.cc b/src/tint/resolver/resolver_behavior_test.cc
index bc4af42..378642b 100644
--- a/src/tint/resolver/resolver_behavior_test.cc
+++ b/src/tint/resolver/resolver_behavior_test.cc
@@ -22,11 +22,12 @@
 #include "src/tint/sem/value_expression.h"
 #include "src/tint/sem/while_statement.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 class ResolverBehaviorTest : public ResolverTest {
   protected:
     void SetUp() override {
@@ -82,7 +83,7 @@
     Func("ArrayDiscardOrNext", utils::Empty, ty.array<i32, 4>(),
          utils::Vector{
              If(true, Block(Discard())),
-             Return(array<i32, 4>()),
+             Return(Call<array<i32, 4>>()),
          });
 
     auto* stmt = Decl(Var("lhs", ty.i32(), IndexAccessor(Call("ArrayDiscardOrNext"), 1_i)));
diff --git a/src/tint/resolver/resolver_test.cc b/src/tint/resolver/resolver_test.cc
index eab9b86..c4d57aa 100644
--- a/src/tint/resolver/resolver_test.cc
+++ b/src/tint/resolver/resolver_test.cc
@@ -48,37 +48,18 @@
 #include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/string_stream.h"
 
+namespace tint::resolver {
+namespace {
+
 using ::testing::ElementsAre;
 using ::testing::HasSubstr;
 
-using namespace tint::number_suffixes;  // NOLINT
-
-namespace tint::resolver {
-namespace {
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 // Helpers and typedefs
 template <typename T>
 using DataType = builder::DataType<T>;
-template <int N, typename T>
-using vec = builder::vec<N, T>;
-template <typename T>
-using vec2 = builder::vec2<T>;
-template <typename T>
-using vec3 = builder::vec3<T>;
-template <typename T>
-using vec4 = builder::vec4<T>;
-template <int N, int M, typename T>
-using mat = builder::mat<N, M, T>;
-template <typename T>
-using mat2x2 = builder::mat2x2<T>;
-template <typename T>
-using mat2x3 = builder::mat2x3<T>;
-template <typename T>
-using mat3x2 = builder::mat3x2<T>;
-template <typename T>
-using mat3x3 = builder::mat3x3<T>;
-template <typename T>
-using mat4x4 = builder::mat4x4<T>;
 template <typename T, int ID = 0>
 using alias = builder::alias<T, ID>;
 template <typename T>
@@ -666,7 +647,7 @@
 }
 
 TEST_F(ResolverTest, Expr_Initializer_Type_Vec2) {
-    auto* tc = vec2<f32>(1_f, 1_f);
+    auto* tc = Call<vec2<f32>>(1_f, 1_f);
     WrapInFunction(tc);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -678,7 +659,7 @@
 }
 
 TEST_F(ResolverTest, Expr_Initializer_Type_Vec3) {
-    auto* tc = vec3<f32>(1_f, 1_f, 1_f);
+    auto* tc = Call<vec3<f32>>(1_f, 1_f, 1_f);
     WrapInFunction(tc);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -690,7 +671,7 @@
 }
 
 TEST_F(ResolverTest, Expr_Initializer_Type_Vec4) {
-    auto* tc = vec4<f32>(1_f, 1_f, 1_f, 1_f);
+    auto* tc = Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f);
     WrapInFunction(tc);
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -756,7 +737,7 @@
     // var a : array<bool, 10u> = 0;
     // var idx : f32 = f32();
     // var f : f32 = a[idx];
-    auto* a = Var("a", ty.array<bool, 10>(), array<bool, 10>());
+    auto* a = Var("a", ty.array<bool, 10>(), Call<array<bool, 10>>());
     auto* idx = Var("idx", ty.f32(), Call<f32>());
     auto* f = Var("f", ty.f32(), IndexAccessor("a", Expr(Source{{12, 34}}, idx)));
     Func("my_func", utils::Empty, ty.void_(),
@@ -803,7 +784,7 @@
     auto* v = Expr("v");
     auto* p = Expr("p");
     auto* v_decl = Decl(Var("v", ty.f32()));
-    auto* p_decl = Decl(Let("p", ty.ptr<f32>(builtin::AddressSpace::kFunction), AddressOf(v)));
+    auto* p_decl = Decl(Let("p", ty.ptr<function, f32>(), AddressOf(v)));
     auto* assign = Assign(Deref(p), 1.23_f);
     Func("my_func", utils::Empty, ty.void_(),
          utils::Vector{
@@ -2138,7 +2119,7 @@
               Binding(1_a));
     GlobalVar("s", ty.sampler(type::SamplerKind::kSampler), Group(1_a), Binding(2_a));
 
-    auto* call = Call("textureSample", "t", "s", vec2<f32>(1_f, 2_f));
+    auto* call = Call("textureSample", "t", "s", Call<vec2<f32>>(1_f, 2_f));
     const ast::Function* f =
         Func("test_function", utils::Empty, ty.void_(), utils::Vector{Assign(Phony(), call)},
              utils::Vector{Stage(ast::PipelineStage::kFragment)});
@@ -2157,7 +2138,7 @@
               Binding(1_a));
     GlobalVar("s", ty.sampler(type::SamplerKind::kSampler), Group(1_a), Binding(2_a));
 
-    auto* inner_call = Assign(Phony(), Call("textureSample", "t", "s", vec2<f32>(1_f, 2_f)));
+    auto* inner_call = Assign(Phony(), Call("textureSample", "t", "s", Call<vec2<f32>>(1_f, 2_f)));
     const ast::Function* inner_func =
         Func("inner_func", utils::Empty, ty.void_(), utils::Vector{inner_call});
     auto* outer_call = CallStmt(Call("inner_func"));
@@ -2183,10 +2164,12 @@
               Binding(1_a));
     GlobalVar("s", ty.sampler(type::SamplerKind::kSampler), Group(1_a), Binding(2_a));
 
-    auto* inner_call_1 = Assign(Phony(), Call("textureSample", "t", "s", vec2<f32>(1_f, 2_f)));
+    auto* inner_call_1 =
+        Assign(Phony(), Call("textureSample", "t", "s", Call<vec2<f32>>(1_f, 2_f)));
     const ast::Function* inner_func_1 =
         Func("inner_func_1", utils::Empty, ty.void_(), utils::Vector{inner_call_1});
-    auto* inner_call_2 = Assign(Phony(), Call("textureSample", "t", "s", vec2<f32>(3_f, 4_f)));
+    auto* inner_call_2 =
+        Assign(Phony(), Call("textureSample", "t", "s", Call<vec2<f32>>(3_f, 4_f)));
     const ast::Function* inner_func_2 =
         Func("inner_func_2", utils::Empty, ty.void_(), utils::Vector{inner_call_2});
     auto* outer_call_1 = CallStmt(Call("inner_func_1"));
@@ -2220,10 +2203,12 @@
               Binding(2_a));
     GlobalVar("s", ty.sampler(type::SamplerKind::kSampler), Group(1_a), Binding(3_a));
 
-    auto* inner_call_1 = Assign(Phony(), Call("textureSample", "t1", "s", vec2<f32>(1_f, 2_f)));
+    auto* inner_call_1 =
+        Assign(Phony(), Call("textureSample", "t1", "s", Call<vec2<f32>>(1_f, 2_f)));
     const ast::Function* inner_func_1 =
         Func("inner_func_1", utils::Empty, ty.void_(), utils::Vector{inner_call_1});
-    auto* inner_call_2 = Assign(Phony(), Call("textureSample", "t2", "s", vec2<f32>(3_f, 4_f)));
+    auto* inner_call_2 =
+        Assign(Phony(), Call("textureSample", "t2", "s", Call<vec2<f32>>(3_f, 4_f)));
     const ast::Function* inner_func_2 =
         Func("inner_func_2", utils::Empty, ty.void_(), utils::Vector{inner_call_2});
     auto* outer_call_1 = CallStmt(Call("inner_func_1"));
@@ -2299,10 +2284,9 @@
 
     Func("helper",
          utils::Vector{
-             Param("sl", ty.ptr(builtin::AddressSpace::kFunction,
-                                ty.sampler(type::SamplerKind::kSampler))),
-             Param("tl", ty.ptr(builtin::AddressSpace::kFunction,
-                                ty.sampled_texture(type::TextureDimension::k2d, ty.f32()))),
+             Param("sl", ty.ptr<function>(ty.sampler(type::SamplerKind::kSampler))),
+             Param("tl",
+                   ty.ptr<function>(ty.sampled_texture(type::TextureDimension::k2d, ty.f32()))),
          },
          ty.vec4<f32>(),
          utils::Vector{
@@ -2537,7 +2521,7 @@
 }
 
 TEST_F(ResolverTest, MaxNestDepthOfCompositeType_ArraysOfVector_Valid) {
-    auto a = ty.array(ty.vec3<i32>(), 10_u);
+    auto a = ty.array<vec3<i32>, 10>();
     size_t depth = 2;  // Depth of array + vector
     size_t iterations = kMaxNestDepthOfCompositeType - depth;
     for (size_t i = 0; i < iterations; ++i) {
diff --git a/src/tint/resolver/resolver_test_helper.h b/src/tint/resolver/resolver_test_helper.h
index 706ba89..4f72b9c 100644
--- a/src/tint/resolver/resolver_test_helper.h
+++ b/src/tint/resolver/resolver_test_helper.h
@@ -130,51 +130,6 @@
 
 namespace builder {
 
-template <uint32_t N, typename T>
-struct vec {};
-
-template <typename T>
-using vec2 = vec<2, T>;
-
-template <typename T>
-using vec3 = vec<3, T>;
-
-template <typename T>
-using vec4 = vec<4, T>;
-
-template <uint32_t N, uint32_t M, typename T>
-struct mat {};
-
-template <typename T>
-using mat2x2 = mat<2, 2, T>;
-
-template <typename T>
-using mat2x3 = mat<2, 3, T>;
-
-template <typename T>
-using mat2x4 = mat<2, 4, T>;
-
-template <typename T>
-using mat3x2 = mat<3, 2, T>;
-
-template <typename T>
-using mat3x3 = mat<3, 3, T>;
-
-template <typename T>
-using mat3x4 = mat<3, 4, T>;
-
-template <typename T>
-using mat4x2 = mat<4, 2, T>;
-
-template <typename T>
-using mat4x3 = mat<4, 3, T>;
-
-template <typename T>
-using mat4x4 = mat<4, 4, T>;
-
-template <uint32_t N, typename T>
-struct array {};
-
 template <typename TO, int ID = 0>
 struct alias {};
 
@@ -187,9 +142,6 @@
 template <typename TO>
 using alias3 = alias<TO, 3>;
 
-template <typename TO>
-struct ptr {};
-
 /// A scalar value
 using Scalar = std::variant<i32, u32, f32, f16, AInt, AFloat, bool>;
 
@@ -446,7 +398,7 @@
 
 /// Helper for building vector types and expressions
 template <uint32_t N, typename T>
-struct DataType<vec<N, T>> {
+struct DataType<builtin::fluent_types::vec<N, T>> {
     /// The element type
     using ElementType = T;
 
@@ -457,7 +409,7 @@
     /// @return a new AST vector type
     static inline ast::Type AST(ProgramBuilder& b) {
         if (IsInferOrAbstract<T>) {
-            return b.ty.vec<Infer, N>();
+            return b.ty.vec<builtin::fluent_types::Infer, N>();
         } else {
             return b.ty.vec(DataType<T>::AST(b), N);
         }
@@ -498,7 +450,7 @@
 
 /// Helper for building matrix types and expressions
 template <uint32_t N, uint32_t M, typename T>
-struct DataType<mat<N, M, T>> {
+struct DataType<builtin::fluent_types::mat<N, M, T>> {
     /// The element type
     using ElementType = T;
 
@@ -509,7 +461,7 @@
     /// @return a new AST matrix type
     static inline ast::Type AST(ProgramBuilder& b) {
         if (IsInferOrAbstract<T>) {
-            return b.ty.mat<Infer, N, M>();
+            return b.ty.mat<builtin::fluent_types::Infer, N, M>();
         } else {
             return b.ty.mat(DataType<T>::AST(b), N, M);
         }
@@ -535,13 +487,14 @@
         utils::Vector<const ast::Expression*, N> r;
         for (uint32_t i = 0; i < N; ++i) {
             if (one_value) {
-                r.Push(DataType<vec<M, T>>::Expr(b, utils::Vector<Scalar, 1>{args[0]}));
+                r.Push(DataType<builtin::fluent_types::vec<M, T>>::Expr(
+                    b, utils::Vector<Scalar, 1>{args[0]}));
             } else {
                 utils::Vector<Scalar, M> v;
                 for (size_t j = 0; j < M; ++j) {
                     v.Push(args[next++]);
                 }
-                r.Push(DataType<vec<M, T>>::Expr(b, std::move(v)));
+                r.Push(DataType<builtin::fluent_types::vec<M, T>>::Expr(b, std::move(v)));
             }
         }
         return r;
@@ -618,7 +571,8 @@
 
 /// Helper for building pointer types and expressions
 template <typename T>
-struct DataType<ptr<T>> {
+struct DataType<
+    builtin::fluent_types::ptr<builtin::AddressSpace::kPrivate, T, builtin::Access::kUndefined>> {
     /// The element type
     using ElementType = typename DataType<T>::ElementType;
 
@@ -628,9 +582,9 @@
     /// @param b the ProgramBuilder
     /// @return a new AST alias type
     static inline ast::Type AST(ProgramBuilder& b) {
-        return b.ty.ptr(builtin::AddressSpace::kPrivate, DataType<T>::AST(b),
-                        builtin::Access::kUndefined);
+        return b.ty.ptr<builtin::AddressSpace::kPrivate, T>();
     }
+
     /// @param b the ProgramBuilder
     /// @return the semantic aliased type
     static inline const type::Type* Sem(ProgramBuilder& b) {
@@ -659,8 +613,8 @@
 };
 
 /// Helper for building array types and expressions
-template <uint32_t N, typename T>
-struct DataType<array<N, T>> {
+template <typename T, uint32_t N>
+struct DataType<builtin::fluent_types::array<T, N>> {
     /// The element type
     using ElementType = typename DataType<T>::ElementType;
 
@@ -673,7 +627,7 @@
         if (auto ast = DataType<T>::AST(b)) {
             return b.ty.array(ast, u32(N));
         }
-        return b.ty.array<Infer>();
+        return b.ty.array<builtin::fluent_types::Infer>();
     }
     /// @param b the ProgramBuilder
     /// @return the semantic array type
@@ -832,7 +786,7 @@
                   "Vector args must all be the same type");
     constexpr size_t N = sizeof...(args);
     utils::Vector<Scalar, sizeof...(args)> v{args...};
-    return Value::Create<vec<N, FirstT>>(std::move(v));
+    return Value::Create<builtin::fluent_types::vec<N, FirstT>>(std::move(v));
 }
 
 /// Creates a Value of DataType<array<N, T>> from N scalar `args`
@@ -843,7 +797,7 @@
                   "Array args must all be the same type");
     constexpr size_t N = sizeof...(args);
     utils::Vector<Scalar, sizeof...(args)> v{args...};
-    return Value::Create<array<N, FirstT>>(std::move(v));
+    return Value::Create<builtin::fluent_types::array<FirstT, N>>(std::move(v));
 }
 
 /// Creates a Value of DataType<mat<C,R,T> from C*R scalar `args`
@@ -855,7 +809,7 @@
             m.Push(m_in[i][j]);
         }
     }
-    return Value::Create<mat<C, R, T>>(std::move(m));
+    return Value::Create<builtin::fluent_types::mat<C, R, T>>(std::move(m));
 }
 
 /// Creates a Value of DataType<mat<2,R,T> from column vectors `c0` and `c1`
@@ -869,7 +823,7 @@
     for (auto v : c1) {
         m.Push(v);
     }
-    return Value::Create<mat<C, R, T>>(std::move(m));
+    return Value::Create<builtin::fluent_types::mat<C, R, T>>(std::move(m));
 }
 
 /// Creates a Value of DataType<mat<3,R,T> from column vectors `c0`, `c1`, and `c2`
@@ -886,7 +840,7 @@
     for (auto v : c2) {
         m.Push(v);
     }
-    return Value::Create<mat<C, R, T>>(std::move(m));
+    return Value::Create<builtin::fluent_types::mat<C, R, T>>(std::move(m));
 }
 
 /// Creates a Value of DataType<mat<4,R,T> from column vectors `c0`, `c1`, `c2`, and `c3`
@@ -906,7 +860,7 @@
     for (auto v : c3) {
         m.Push(v);
     }
-    return Value::Create<mat<C, R, T>>(std::move(m));
+    return Value::Create<builtin::fluent_types::mat<C, R, T>>(std::move(m));
 }
 }  // namespace builder
 }  // namespace tint::resolver
diff --git a/src/tint/resolver/root_identifier_test.cc b/src/tint/resolver/root_identifier_test.cc
index 4ff43cb..f6d88f8 100644
--- a/src/tint/resolver/root_identifier_test.cc
+++ b/src/tint/resolver/root_identifier_test.cc
@@ -19,11 +19,12 @@
 #include "src/tint/sem/member_accessor_expression.h"
 #include "src/tint/type/texture_dimension.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 class ResolverRootIdentifierTest : public ResolverTest {};
 
 TEST_F(ResolverRootIdentifierTest, GlobalPrivateVar) {
@@ -142,7 +143,7 @@
     // {
     //   let b = a;
     // }
-    auto* param = Param("a", ty.ptr(builtin::AddressSpace::kFunction, ty.f32()));
+    auto* param = Param("a", ty.ptr<function, f32>());
     auto* expr_param = Expr(param);
     auto* let = Let("b", expr_param);
     auto* expr_let = Expr("b");
diff --git a/src/tint/resolver/struct_pipeline_stage_use_test.cc b/src/tint/resolver/struct_pipeline_stage_use_test.cc
index b4857f0..70e6046 100644
--- a/src/tint/resolver/struct_pipeline_stage_use_test.cc
+++ b/src/tint/resolver/struct_pipeline_stage_use_test.cc
@@ -20,13 +20,13 @@
 #include "src/tint/resolver/resolver_test_helper.h"
 #include "src/tint/sem/struct.h"
 
-using ::testing::UnorderedElementsAre;
-
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using ::testing::UnorderedElementsAre;
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using ResolverPipelineStageUseTest = ResolverTest;
 
 TEST_F(ResolverPipelineStageUseTest, UnusedStruct) {
@@ -68,7 +68,7 @@
     auto* s = Structure("S", utils::Vector{Member("a", ty.f32(), utils::Vector{Location(0_a)})});
 
     Func("main", utils::Vector{Param("param", ty.Of(s))}, ty.vec4<f32>(),
-         utils::Vector{Return(Call(ty.vec4<f32>()))},
+         utils::Vector{Return(Call<vec4<f32>>())},
          utils::Vector{Stage(ast::PipelineStage::kVertex)},
          utils::Vector{Builtin(builtin::BuiltinValue::kPosition)});
 
diff --git a/src/tint/resolver/type_validation_test.cc b/src/tint/resolver/type_validation_test.cc
index de79f85..cd6a66d 100644
--- a/src/tint/resolver/type_validation_test.cc
+++ b/src/tint/resolver/type_validation_test.cc
@@ -23,7 +23,8 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::resolver {
 namespace {
@@ -32,32 +33,6 @@
 template <typename T>
 using DataType = builder::DataType<T>;
 template <typename T>
-using vec2 = builder::vec2<T>;
-template <typename T>
-using vec3 = builder::vec3<T>;
-template <typename T>
-using vec4 = builder::vec4<T>;
-template <typename T>
-using mat2x2 = builder::mat2x2<T>;
-template <typename T>
-using mat2x3 = builder::mat2x3<T>;
-template <typename T>
-using mat2x4 = builder::mat2x4<T>;
-template <typename T>
-using mat3x2 = builder::mat3x2<T>;
-template <typename T>
-using mat3x3 = builder::mat3x3<T>;
-template <typename T>
-using mat3x4 = builder::mat3x4<T>;
-template <typename T>
-using mat4x2 = builder::mat4x2<T>;
-template <typename T>
-using mat4x3 = builder::mat4x3<T>;
-template <typename T>
-using mat4x4 = builder::mat4x4<T>;
-template <int N, typename T>
-using array = builder::array<N, T>;
-template <typename T>
 using alias = builder::alias<T>;
 template <typename T>
 using alias1 = builder::alias1<T>;
@@ -331,7 +306,7 @@
 TEST_F(ResolverTypeValidationTest, ArraySize_IVecConst) {
     // const size = vec2<i32>(100, 100);
     // var<private> a : array<f32, size>;
-    GlobalConst("size", Call(ty.vec2<i32>(), 100_i, 100_i));
+    GlobalConst("size", Call<vec2<i32>>(100_i, 100_i));
     GlobalVar("a", ty.array(ty.f32(), Expr(Source{{12, 34}}, "size")),
               builtin::AddressSpace::kPrivate);
     EXPECT_FALSE(r()->Resolve());
@@ -881,7 +856,7 @@
 }
 
 TEST_F(ResolverTypeValidationTest, ArrayOfNonStorableTypeWithStride) {
-    auto ptr_ty = ty.ptr<u32>(Source{{12, 34}}, builtin::AddressSpace::kUniform);
+    auto ptr_ty = ty.ptr<uniform, u32>(Source{{12, 34}});
     GlobalVar("arr", ty.array(ptr_ty, 4_i, utils::Vector{Stride(16)}),
               builtin::AddressSpace::kPrivate);
 
@@ -1305,8 +1280,8 @@
                                          ParamsFor<mat2x2<f16>>(3, 2),
                                          ParamsFor<mat3x3<f16>>(3, 3),
                                          ParamsFor<mat4x4<f16>>(3, 4),
-                                         ParamsFor<array<2, f32>>(4, 2),
-                                         ParamsFor<array<2, f16>>(4, 2)));
+                                         ParamsFor<array<f32, 2>>(4, 2),
+                                         ParamsFor<array<f16, 2>>(4, 2)));
 }  // namespace MatrixTests
 
 namespace VectorTests {
@@ -1366,8 +1341,7 @@
               builtin::AddressSpace::kPrivate);
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
-              "12:34 error: vector element type must be 'bool', 'f32', 'f16', 'i32' "
-              "or 'u32'");
+              "12:34 error: vector element type must be 'bool', 'f32', 'f16', 'i32' or 'u32'");
 }
 INSTANTIATE_TEST_SUITE_P(ResolverTypeValidationTest,
                          InvalidVectorElementTypes,
@@ -1377,7 +1351,7 @@
                                          ParamsFor<mat2x2<f32>>(2),
                                          ParamsFor<mat3x3<f16>>(2),
                                          ParamsFor<mat4x4<f32>>(2),
-                                         ParamsFor<array<2, f32>>(2)));
+                                         ParamsFor<array<f32, 2>>(2)));
 }  // namespace VectorTests
 
 namespace BuiltinTypeAliasTests {
diff --git a/src/tint/resolver/uniformity_test.cc b/src/tint/resolver/uniformity_test.cc
index e890bcb..5bf5fda 100644
--- a/src/tint/resolver/uniformity_test.cc
+++ b/src/tint/resolver/uniformity_test.cc
@@ -25,7 +25,8 @@
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::resolver {
 namespace {
@@ -5301,8 +5302,7 @@
     }
     foo_body.Push(b.Decl(b.Let("rhs", rhs_init)));
     for (int i = 0; i < 255; i++) {
-        params.Push(
-            b.Param("p" + std::to_string(i), ty.ptr(builtin::AddressSpace::kFunction, ty.i32())));
+        params.Push(b.Param("p" + std::to_string(i), ty.ptr<function, i32>()));
         if (i > 0) {
             foo_body.Push(b.Assign(b.Deref("p" + std::to_string(i)), "rhs"));
         }
diff --git a/src/tint/resolver/validation_test.cc b/src/tint/resolver/validation_test.cc
index ca958ad..238120f 100644
--- a/src/tint/resolver/validation_test.cc
+++ b/src/tint/resolver/validation_test.cc
@@ -43,7 +43,8 @@
 using ::testing::ElementsAre;
 using ::testing::HasSubstr;
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::resolver {
 namespace {
@@ -380,7 +381,7 @@
     //     let x: f32 = (*p).z;
     //     return x;
     // }
-    auto* p = Param("p", ty.ptr(builtin::AddressSpace::kFunction, ty.vec4<f32>()));
+    auto* p = Param("p", ty.ptr<function, vec4<f32>>());
     auto* star_p = Deref(p);
     auto* accessor_expr = MemberAccessor(star_p, "z");
     auto* x = Var("x", ty.f32(), accessor_expr);
@@ -397,7 +398,7 @@
     //     let x: f32 = *p.z;
     //     return x;
     // }
-    auto* p = Param("p", ty.ptr(builtin::AddressSpace::kFunction, ty.vec4<f32>()));
+    auto* p = Param("p", ty.ptr<function, vec4<f32>>());
     auto* accessor_expr = MemberAccessor(p, Ident(Source{{12, 34}}, "z"));
     auto* star_p = Deref(accessor_expr);
     auto* x = Var("x", ty.f32(), star_p);
@@ -1234,8 +1235,8 @@
 
 TEST_F(ResolverTest, Expr_Initializer_Cast_Pointer) {
     auto* vf = Var("vf", ty.f32());
-    auto* c = Call(Source{{12, 34}}, ty.ptr<i32>(builtin::AddressSpace::kFunction), ExprList(vf));
-    auto* ip = Let("ip", ty.ptr<i32>(builtin::AddressSpace::kFunction), c);
+    auto* c = Call(Source{{12, 34}}, ty.ptr<function, i32>(), ExprList(vf));
+    auto* ip = Let("ip", ty.ptr<function, i32>(), c);
     WrapInFunction(Decl(vf), Decl(ip));
 
     EXPECT_FALSE(r()->Resolve());
diff --git a/src/tint/resolver/value_constructor_validation_test.cc b/src/tint/resolver/value_constructor_validation_test.cc
index 3b7ad64..4e41d25 100644
--- a/src/tint/resolver/value_constructor_validation_test.cc
+++ b/src/tint/resolver/value_constructor_validation_test.cc
@@ -19,11 +19,12 @@
 #include "src/tint/type/reference.h"
 #include "src/tint/utils/string_stream.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::resolver {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using ::testing::HasSubstr;
 
 // Helpers and typedefs
@@ -34,14 +35,6 @@
 using builder::CreatePtrs;
 using builder::CreatePtrsFor;
 using builder::DataType;
-using builder::mat2x2;
-using builder::mat2x3;
-using builder::mat3x2;
-using builder::mat3x3;
-using builder::mat4x4;
-using builder::vec2;
-using builder::vec3;
-using builder::vec4;
 
 class ResolverValueConstructorValidationTest : public resolver::TestHelper, public testing::Test {};
 
@@ -478,7 +471,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, ConversionConstructorInvalid_InvalidConstructor) {
-    auto* a = Var("a", ty.f32(), Call(Source{{12, 34}}, ty.f32(), Call(ty.array<f32, 4>())));
+    auto* a = Var("a", ty.f32(), Call(Source{{12, 34}}, ty.f32(), Call<array<f32, 4>>()));
     WrapInFunction(a);
 
     ASSERT_FALSE(r()->Resolve());
@@ -492,7 +485,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, Array_ZeroValue_Pass) {
     // array<u32, 10u>();
-    auto* tc = array<u32, 10>();
+    auto* tc = Call<array<u32, 10>>();
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -508,7 +501,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, Array_U32U32U32) {
     // array<u32, 3u>(0u, 10u, 20u);
-    auto* tc = array<u32, 3>(0_u, 10_u, 20_u);
+    auto* tc = Call<array<u32, 3>>(0_u, 10_u, 20_u);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -527,7 +520,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArray_U32U32U32) {
     // array(0u, 10u, 20u);
-    auto* tc = array<Infer>(Source{{12, 34}}, 0_u, 10_u, 20_u);
+    auto* tc = Call<array<Infer>>(Source{{12, 34}}, 0_u, 10_u, 20_u);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -546,7 +539,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, Array_U32AIU32) {
     // array<u32, 3u>(0u, 10, 20u);
-    auto* tc = array<u32, 3>(0_u, 10_a, 20_u);
+    auto* tc = Call<array<u32, 3>>(0_u, 10_a, 20_u);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -565,7 +558,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArray_U32AIU32) {
     // array(0u, 10u, 20u);
-    auto* tc = array<Infer>(Source{{12, 34}}, 0_u, 10_a, 20_u);
+    auto* tc = Call<array<Infer>>(Source{{12, 34}}, 0_u, 10_a, 20_u);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -584,7 +577,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, ArrayU32_AIAIAI) {
     // array<u32, 3u>(0, 10, 20);
-    auto* tc = array<u32, 3>(0_a, 10_a, 20_a);
+    auto* tc = Call<array<u32, 3>>(0_a, 10_a, 20_a);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -603,7 +596,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArray_AIAIAI) {
     // const c = array(0, 10, 20);
-    auto* tc = array<Infer>(Source{{12, 34}}, 0_a, 10_a, 20_a);
+    auto* tc = Call<array<Infer>>(Source{{12, 34}}, 0_a, 10_a, 20_a);
     WrapInFunction(Decl(Const("C", tc)));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -622,9 +615,9 @@
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArrayU32_VecI32_VecAI) {
     // array(vec2(10i), vec2(20));
-    auto* tc = array<Infer>(Source{{12, 34}},              //
-                            Call(ty.vec<Infer>(2), 20_i),  //
-                            Call(ty.vec<Infer>(2), 20_a));
+    auto* tc = Call<array<Infer>>(Source{{12, 34}},         //
+                                  Call<vec2<Infer>>(20_i),  //
+                                  Call<vec2<Infer>>(20_a));
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -644,9 +637,9 @@
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArrayU32_VecAI_VecF32) {
     // array(vec2(20), vec2(10f));
-    auto* tc = array<Infer>(Source{{12, 34}},              //
-                            Call(ty.vec<Infer>(2), 20_a),  //
-                            Call(ty.vec<Infer>(2), 20_f));
+    auto* tc = Call<array<Infer>>(Source{{12, 34}},         //
+                                  Call<vec2<Infer>>(20_a),  //
+                                  Call<vec2<Infer>>(20_f));
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -666,7 +659,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_U32F32) {
     // array<u32, 3u>(0u, 1.0f, 20u);
-    auto* tc = array<u32, 3>(0_u, Expr(Source{{12, 34}}, 1_f), 20_u);
+    auto* tc = Call<array<u32, 3>>(0_u, Expr(Source{{12, 34}}, 1_f), 20_u);
     WrapInFunction(tc);
 
     EXPECT_FALSE(r()->Resolve());
@@ -675,7 +668,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_U32F32) {
     // array(0u, 1.0f, 20u);
-    auto* tc = array<Infer>(Source{{12, 34}}, 0_u, 1_f, 20_u);
+    auto* tc = Call<array<Infer>>(Source{{12, 34}}, 0_u, 1_f, 20_u);
     WrapInFunction(tc);
 
     EXPECT_FALSE(r()->Resolve());
@@ -687,7 +680,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_F32I32) {
     // array<f32, 1u>(1i);
-    auto* tc = array<f32, 1>(Expr(Source{{12, 34}}, 1_i));
+    auto* tc = Call<array<f32, 1>>(Expr(Source{{12, 34}}, 1_i));
     WrapInFunction(tc);
 
     EXPECT_FALSE(r()->Resolve());
@@ -696,7 +689,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_F32I32) {
     // array(1f, 1i);
-    auto* tc = array<Infer>(Source{{12, 34}}, 1_f, 1_i);
+    auto* tc = Call<array<Infer>>(Source{{12, 34}}, 1_f, 1_i);
     WrapInFunction(tc);
 
     EXPECT_FALSE(r()->Resolve());
@@ -708,7 +701,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_U32I32) {
     // array<u32, 1u>(1i, 0u, 0u, 0u, 0u, 0u);
-    auto* tc = array<u32, 1>(Expr(Source{{12, 34}}, 1_i), 0_u, 0_u, 0_u, 0_u);
+    auto* tc = Call<array<u32, 1>>(Expr(Source{{12, 34}}, 1_i), 0_u, 0_u, 0_u, 0_u);
     WrapInFunction(tc);
 
     EXPECT_FALSE(r()->Resolve());
@@ -717,7 +710,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_U32I32) {
     // array(1i, 0u, 0u, 0u, 0u, 0u);
-    auto* tc = array<Infer>(Source{{12, 34}}, 1_i, 0_u, 0_u, 0_u, 0_u);
+    auto* tc = Call<array<Infer>>(Source{{12, 34}}, 1_i, 0_u, 0_u, 0_u, 0_u);
     WrapInFunction(tc);
 
     EXPECT_FALSE(r()->Resolve());
@@ -729,7 +722,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_I32Vec2) {
     // array<i32, 3u>(1i, vec2<i32>());
-    auto* tc = array<i32, 3>(1_i, vec2<i32>(Source{{12, 34}}));
+    auto* tc = Call<array<i32, 3>>(1_i, Call<vec2<i32>>(Source{{12, 34}}));
     WrapInFunction(tc);
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
@@ -738,7 +731,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_I32Vec2) {
     // array(1i, vec2<i32>());
-    auto* tc = array<Infer>(Source{{12, 34}}, 1_i, vec2<i32>());
+    auto* tc = Call<array<Infer>>(Source{{12, 34}}, 1_i, Call<vec2<i32>>());
     WrapInFunction(tc);
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
@@ -749,7 +742,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_Vec3i32_Vec3u32) {
     // array<vec3<i32>, 2u>(vec3<u32>(), vec3<u32>());
-    auto* t = array(ty.vec3<i32>(), 2_u, vec3<u32>(Source{{12, 34}}), vec3<u32>());
+    auto* t = Call<array<vec3<i32>, 2>>(Call<vec3<u32>>(Source{{12, 34}}), Call<vec3<u32>>());
     WrapInFunction(t);
 
     EXPECT_FALSE(r()->Resolve());
@@ -759,7 +752,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_Vec3i32_Vec3u32) {
     // array(vec3<i32>(), vec3<u32>());
-    auto* t = array<Infer>(Source{{12, 34}}, vec3<i32>(), vec3<u32>());
+    auto* t = Call<array<Infer>>(Source{{12, 34}}, Call<vec3<i32>>(), Call<vec3<u32>>());
     WrapInFunction(t);
 
     EXPECT_FALSE(r()->Resolve());
@@ -771,7 +764,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_Vec3i32_Vec3AF) {
     // array(vec3<i32>(), vec3(1.0));
-    auto* t = array<Infer>(Source{{12, 34}}, vec3<i32>(), Call("vec3", 1._a));
+    auto* t = Call<array<Infer>>(Source{{12, 34}}, Call<vec3<i32>>(), Call("vec3", 1._a));
     WrapInFunction(t);
 
     EXPECT_FALSE(r()->Resolve());
@@ -783,7 +776,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, ArrayArgumentTypeMismatch_Vec3i32_Vec3bool) {
     // array<vec3<i32>, 2u>(vec3<i32>(), vec3<bool>());
-    auto* t = array(ty.vec3<i32>(), 2_u, vec3<i32>(), vec3<bool>());
+    auto* t = Call<array<vec3<i32>, 2>>(Call<vec3<i32>>(), Call<vec3<bool>>());
     WrapInFunction(t);
 
     EXPECT_FALSE(r()->Resolve());
@@ -793,7 +786,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArrayArgumentTypeMismatch_Vec3i32_Vec3bool) {
     // array(vec3<i32>(), vec3<bool>());
-    auto* t = array<Infer>(Source{{12, 34}}, vec3<i32>(), vec3<bool>());
+    auto* t = Call<array<Infer>>(Source{{12, 34}}, Call<vec3<i32>>(), Call<vec3<bool>>());
     WrapInFunction(t);
 
     EXPECT_FALSE(r()->Resolve());
@@ -805,7 +798,8 @@
 
 TEST_F(ResolverValueConstructorValidationTest, ArrayOfArray_SubElemSizeMismatch) {
     // array<array<i32, 2u>, 2u>(array<i32, 3u>(), array<i32, 2u>());
-    auto* t = array(Source{{12, 34}}, ty.array<i32, 2>(), 2_i, array<i32, 3>(), array<i32, 2>());
+    auto* t = Call<array<array<i32, 2>, 2>>(Source{{12, 34}}, Call<array<i32, 3>>(),
+                                            Call<array<i32, 2>>());
     WrapInFunction(t);
 
     EXPECT_FALSE(r()->Resolve());
@@ -815,7 +809,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArrayOfArray_SubElemSizeMismatch) {
     // array<array<i32, 2u>, 2u>(array<i32, 3u>(), array<i32, 2u>());
-    auto* t = array<Infer>(Source{{12, 34}}, array<i32, 3>(), array<i32, 2>());
+    auto* t = Call<array<Infer>>(Source{{12, 34}}, Call<array<i32, 3>>(), Call<array<i32, 2>>());
     WrapInFunction(t);
 
     EXPECT_FALSE(r()->Resolve());
@@ -827,7 +821,8 @@
 
 TEST_F(ResolverValueConstructorValidationTest, ArrayOfArray_SubElemTypeMismatch) {
     // array<array<i32, 2u>, 2u>(array<i32, 2u>(), array<u32, 2u>());
-    auto* t = array(Source{{12, 34}}, ty.array<i32, 2>(), 2_i, array<i32, 2>(), array<u32, 2>());
+    auto* t = Call<array<array<i32, 2>, 2>>(Source{{12, 34}}, Call<array<i32, 2>>(),
+                                            Call<array<u32, 2>>());
     WrapInFunction(t);
 
     EXPECT_FALSE(r()->Resolve());
@@ -837,7 +832,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, InferredArrayOfArray_SubElemTypeMismatch) {
     // array<array<i32, 2u>, 2u>(array<i32, 2u>(), array<u32, 2u>());
-    auto* t = array<Infer>(Source{{12, 34}}, array<i32, 2>(), array<u32, 2>());
+    auto* t = Call<array<Infer>>(Source{{12, 34}}, Call<array<i32, 2>>(), Call<array<u32, 2>>());
     WrapInFunction(t);
 
     EXPECT_FALSE(r()->Resolve());
@@ -850,7 +845,7 @@
 TEST_F(ResolverValueConstructorValidationTest, Array_TooFewElements) {
     // array<i32, 4u>(1i, 2i, 3i);
     SetSource(Source::Location({12, 34}));
-    auto* tc = array<i32, 4>(Expr(1_i), Expr(2_i), Expr(3_i));
+    auto* tc = Call<array<i32, 4>>(Expr(1_i), Expr(2_i), Expr(3_i));
     WrapInFunction(tc);
 
     EXPECT_FALSE(r()->Resolve());
@@ -861,7 +856,7 @@
 TEST_F(ResolverValueConstructorValidationTest, Array_TooManyElements) {
     // array<i32, 4u>(1i, 2i, 3i, 4i, 5i);
     SetSource(Source::Location({12, 34}));
-    auto* tc = array<i32, 4>(Expr(1_i), Expr(2_i), Expr(3_i), Expr(4_i), Expr(5_i));
+    auto* tc = Call<array<i32, 4>>(Expr(1_i), Expr(2_i), Expr(3_i), Expr(4_i), Expr(5_i));
     WrapInFunction(tc);
 
     EXPECT_FALSE(r()->Resolve());
@@ -873,7 +868,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, Array_Runtime) {
     // array<i32>(1i);
-    auto* tc = array<i32>(Source{{12, 34}}, Expr(1_i));
+    auto* tc = Call<array<i32>>(Source{{12, 34}}, Expr(1_i));
     WrapInFunction(tc);
 
     EXPECT_FALSE(r()->Resolve());
@@ -882,7 +877,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, Array_RuntimeZeroValue) {
     // array<i32>();
-    auto* tc = array<i32>(Source{{12, 34}});
+    auto* tc = Call<array<i32>>(Source{{12, 34}});
     WrapInFunction(tc);
 
     EXPECT_FALSE(r()->Resolve());
@@ -1048,7 +1043,7 @@
 namespace VectorConstructor {
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2F32_Error_ScalarArgumentTypeMismatch) {
-    WrapInFunction(vec2<f32>(Source{{12, 34}}, 1_i, 2_f));
+    WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, 1_i, 2_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1058,7 +1053,7 @@
 TEST_F(ResolverValueConstructorValidationTest, Vec2F16_Error_ScalarArgumentTypeMismatch) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(vec2<f16>(Source{{12, 34}}, 1_h, 2_f));
+    WrapInFunction(Call<vec2<f16>>(Source{{12, 34}}, 1_h, 2_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1066,7 +1061,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2U32_Error_ScalarArgumentTypeMismatch) {
-    WrapInFunction(vec2<u32>(Source{{12, 34}}, 1_u, 2_i));
+    WrapInFunction(Call<vec2<u32>>(Source{{12, 34}}, 1_u, 2_i));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1074,7 +1069,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2I32_Error_ScalarArgumentTypeMismatch) {
-    WrapInFunction(vec2<i32>(Source{{12, 34}}, 1_u, 2_i));
+    WrapInFunction(Call<vec2<i32>>(Source{{12, 34}}, 1_u, 2_i));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1082,7 +1077,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2Bool_Error_ScalarArgumentTypeMismatch) {
-    WrapInFunction(vec2<bool>(Source{{12, 34}}, true, 1_i));
+    WrapInFunction(Call<vec2<bool>>(Source{{12, 34}}, true, 1_i));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1090,7 +1085,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_Vec3ArgumentCardinalityTooLarge) {
-    WrapInFunction(vec2<f32>(Source{{12, 34}}, vec3<f32>()));
+    WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, Call<vec3<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1098,7 +1093,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_Vec4ArgumentCardinalityTooLarge) {
-    WrapInFunction(vec2<f32>(Source{{12, 34}}, vec4<f32>()));
+    WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, Call<vec4<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1106,7 +1101,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_TooManyArgumentsScalar) {
-    WrapInFunction(vec2<f32>(Source{{12, 34}}, 1_f, 2_f, 3_f));
+    WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, 1_f, 2_f, 3_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1114,7 +1109,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_TooManyArgumentsVector) {
-    WrapInFunction(vec2<f32>(Source{{12, 34}}, vec2<f32>(), vec2<f32>()));
+    WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), Call<vec2<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1123,7 +1118,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_TooManyArgumentsVectorAndScalar) {
-    WrapInFunction(vec2<f32>(Source{{12, 34}}, vec2<f32>(), 1_f));
+    WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), 1_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1131,7 +1126,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2_Error_InvalidArgumentType) {
-    WrapInFunction(vec2<f32>(Source{{12, 34}}, mat2x2<f32>()));
+    WrapInFunction(Call<vec2<f32>>(Source{{12, 34}}, Call<mat2x2<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1139,7 +1134,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2_Success_ZeroValue) {
-    auto* tc = vec2<f32>();
+    auto* tc = Call<vec2<f32>>();
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1158,7 +1153,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2F32_Success_Scalar) {
-    auto* tc = vec2<f32>(1_f, 1_f);
+    auto* tc = Call<vec2<f32>>(1_f, 1_f);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1181,7 +1176,7 @@
 TEST_F(ResolverValueConstructorValidationTest, Vec2F16_Success_Scalar) {
     Enable(builtin::Extension::kF16);
 
-    auto* tc = vec2<f16>(1_h, 1_h);
+    auto* tc = Call<vec2<f16>>(1_h, 1_h);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1202,7 +1197,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2U32_Success_Scalar) {
-    auto* tc = vec2<u32>(1_u, 1_u);
+    auto* tc = Call<vec2<u32>>(1_u, 1_u);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1223,7 +1218,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2I32_Success_Scalar) {
-    auto* tc = vec2<i32>(1_i, 1_i);
+    auto* tc = Call<vec2<i32>>(1_i, 1_i);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1244,7 +1239,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2Bool_Success_Scalar) {
-    auto* tc = vec2<bool>(true, false);
+    auto* tc = Call<vec2<bool>>(true, false);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1265,7 +1260,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2_Success_Identity) {
-    auto* tc = vec2<f32>(vec2<f32>());
+    auto* tc = Call<vec2<f32>>(Call<vec2<f32>>());
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1285,7 +1280,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2_Success_Vec2TypeConversion) {
-    auto* tc = vec2<f32>(vec2<i32>());
+    auto* tc = Call<vec2<f32>>(Call<vec2<i32>>());
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1305,7 +1300,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3F32_Error_ScalarArgumentTypeMismatch) {
-    WrapInFunction(vec3<f32>(Source{{12, 34}}, 1_f, 2_f, 3_i));
+    WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, 1_f, 2_f, 3_i));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1315,7 +1310,7 @@
 TEST_F(ResolverValueConstructorValidationTest, Vec3F16_Error_ScalarArgumentTypeMismatch) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(vec3<f16>(Source{{12, 34}}, 1_h, 2_h, 3_f));
+    WrapInFunction(Call<vec3<f16>>(Source{{12, 34}}, 1_h, 2_h, 3_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1323,7 +1318,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3U32_Error_ScalarArgumentTypeMismatch) {
-    WrapInFunction(vec3<u32>(Source{{12, 34}}, 1_u, 2_i, 3_u));
+    WrapInFunction(Call<vec3<u32>>(Source{{12, 34}}, 1_u, 2_i, 3_u));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1331,7 +1326,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3I32_Error_ScalarArgumentTypeMismatch) {
-    WrapInFunction(vec3<i32>(Source{{12, 34}}, 1_i, 2_u, 3_i));
+    WrapInFunction(Call<vec3<i32>>(Source{{12, 34}}, 1_i, 2_u, 3_i));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1339,7 +1334,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3Bool_Error_ScalarArgumentTypeMismatch) {
-    WrapInFunction(vec3<bool>(Source{{12, 34}}, false, 1_i, true));
+    WrapInFunction(Call<vec3<bool>>(Source{{12, 34}}, false, 1_i, true));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1347,7 +1342,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_Vec4ArgumentCardinalityTooLarge) {
-    WrapInFunction(vec3<f32>(Source{{12, 34}}, vec4<f32>()));
+    WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<vec4<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1355,7 +1350,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooFewArgumentsScalar) {
-    WrapInFunction(vec3<f32>(Source{{12, 34}}, 1_f, 2_f));
+    WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, 1_f, 2_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1363,7 +1358,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooManyArgumentsScalar) {
-    WrapInFunction(vec3<f32>(Source{{12, 34}}, 1_f, 2_f, 3_f, 4_f));
+    WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, 1_f, 2_f, 3_f, 4_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1372,7 +1367,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooFewArgumentsVec2) {
-    WrapInFunction(vec3<f32>(Source{{12, 34}}, vec2<f32>()));
+    WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<vec2<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1380,7 +1375,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooManyArgumentsVec2) {
-    WrapInFunction(vec3<f32>(Source{{12, 34}}, vec2<f32>(), vec2<f32>()));
+    WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), Call<vec2<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1389,7 +1384,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooManyArgumentsVec2AndScalar) {
-    WrapInFunction(vec3<f32>(Source{{12, 34}}, vec2<f32>(), 1_f, 1_f));
+    WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), 1_f, 1_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1398,7 +1393,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_TooManyArgumentsVec3) {
-    WrapInFunction(vec3<f32>(Source{{12, 34}}, vec3<f32>(), 1_f));
+    WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<vec3<f32>>(), 1_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1406,7 +1401,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Error_InvalidArgumentType) {
-    WrapInFunction(vec3<f32>(Source{{12, 34}}, mat2x2<f32>()));
+    WrapInFunction(Call<vec3<f32>>(Source{{12, 34}}, Call<mat2x2<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1414,7 +1409,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_ZeroValue) {
-    auto* tc = vec3<f32>();
+    auto* tc = Call<vec3<f32>>();
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1433,7 +1428,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3F32_Success_Scalar) {
-    auto* tc = vec3<f32>(1_f, 1_f, 1_f);
+    auto* tc = Call<vec3<f32>>(1_f, 1_f, 1_f);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1457,7 +1452,7 @@
 TEST_F(ResolverValueConstructorValidationTest, Vec3F16_Success_Scalar) {
     Enable(builtin::Extension::kF16);
 
-    auto* tc = vec3<f16>(1_h, 1_h, 1_h);
+    auto* tc = Call<vec3<f16>>(1_h, 1_h, 1_h);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1479,7 +1474,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3U32_Success_Scalar) {
-    auto* tc = vec3<u32>(1_u, 1_u, 1_u);
+    auto* tc = Call<vec3<u32>>(1_u, 1_u, 1_u);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1501,7 +1496,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3I32_Success_Scalar) {
-    auto* tc = vec3<i32>(1_i, 1_i, 1_i);
+    auto* tc = Call<vec3<i32>>(1_i, 1_i, 1_i);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1523,7 +1518,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3Bool_Success_Scalar) {
-    auto* tc = vec3<bool>(true, false, true);
+    auto* tc = Call<vec3<bool>>(true, false, true);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1545,7 +1540,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_Vec2AndScalar) {
-    auto* tc = vec3<f32>(vec2<f32>(), 1_f);
+    auto* tc = Call<vec3<f32>>(Call<vec2<f32>>(), 1_f);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1566,7 +1561,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_ScalarAndVec2) {
-    auto* tc = vec3<f32>(1_f, vec2<f32>());
+    auto* tc = Call<vec3<f32>>(1_f, Call<vec2<f32>>());
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1587,7 +1582,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_Identity) {
-    auto* tc = vec3<f32>(vec3<f32>());
+    auto* tc = Call<vec3<f32>>(Call<vec3<f32>>());
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1607,7 +1602,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3_Success_Vec3TypeConversion) {
-    auto* tc = vec3<f32>(vec3<i32>());
+    auto* tc = Call<vec3<f32>>(Call<vec3<i32>>());
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1627,7 +1622,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4F32_Error_ScalarArgumentTypeMismatch) {
-    WrapInFunction(vec4<f32>(Source{{12, 34}}, 1_f, 1_f, 1_i, 1_f));
+    WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, 1_f, 1_f, 1_i, 1_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1638,7 +1633,7 @@
 TEST_F(ResolverValueConstructorValidationTest, Vec4F16_Error_ScalarArgumentTypeMismatch) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(vec4<f16>(Source{{12, 34}}, 1_h, 1_h, 1_f, 1_h));
+    WrapInFunction(Call<vec4<f16>>(Source{{12, 34}}, 1_h, 1_h, 1_f, 1_h));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1647,7 +1642,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4U32_Error_ScalarArgumentTypeMismatch) {
-    WrapInFunction(vec4<u32>(Source{{12, 34}}, 1_u, 1_u, 1_i, 1_u));
+    WrapInFunction(Call<vec4<u32>>(Source{{12, 34}}, 1_u, 1_u, 1_i, 1_u));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1656,7 +1651,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4I32_Error_ScalarArgumentTypeMismatch) {
-    WrapInFunction(vec4<i32>(Source{{12, 34}}, 1_i, 1_i, 1_u, 1_i));
+    WrapInFunction(Call<vec4<i32>>(Source{{12, 34}}, 1_i, 1_i, 1_u, 1_i));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1665,7 +1660,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4Bool_Error_ScalarArgumentTypeMismatch) {
-    WrapInFunction(vec4<bool>(Source{{12, 34}}, true, false, 1_i, true));
+    WrapInFunction(Call<vec4<bool>>(Source{{12, 34}}, true, false, 1_i, true));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1674,7 +1669,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooFewArgumentsScalar) {
-    WrapInFunction(vec4<f32>(Source{{12, 34}}, 1_f, 2_f, 3_f));
+    WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, 1_f, 2_f, 3_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1682,7 +1677,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsScalar) {
-    WrapInFunction(vec4<f32>(Source{{12, 34}}, 1_f, 2_f, 3_f, 4_f, 5_f));
+    WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, 1_f, 2_f, 3_f, 4_f, 5_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1691,7 +1686,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooFewArgumentsVec2AndScalar) {
-    WrapInFunction(vec4<f32>(Source{{12, 34}}, vec2<f32>(), 1_f));
+    WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), 1_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1699,7 +1694,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec2AndScalars) {
-    WrapInFunction(vec4<f32>(Source{{12, 34}}, vec2<f32>(), 1_f, 2_f, 3_f));
+    WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), 1_f, 2_f, 3_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1708,7 +1703,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec2Vec2Scalar) {
-    WrapInFunction(vec4<f32>(Source{{12, 34}}, vec2<f32>(), vec2<f32>(), 1_f));
+    WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), Call<vec2<f32>>(), 1_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1717,7 +1712,8 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec2Vec2Vec2) {
-    WrapInFunction(vec4<f32>(Source{{12, 34}}, vec2<f32>(), vec2<f32>(), vec2<f32>()));
+    WrapInFunction(
+        Call<vec4<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), Call<vec2<f32>>(), Call<vec2<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1727,7 +1723,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooFewArgumentsVec3) {
-    WrapInFunction(vec4<f32>(Source{{12, 34}}, vec3<f32>()));
+    WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec3<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1735,7 +1731,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec3AndScalars) {
-    WrapInFunction(vec4<f32>(Source{{12, 34}}, vec3<f32>(), 1_f, 2_f));
+    WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec3<f32>>(), 1_f, 2_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1744,7 +1740,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec3AndVec2) {
-    WrapInFunction(vec4<f32>(Source{{12, 34}}, vec3<f32>(), vec2<f32>()));
+    WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec3<f32>>(), Call<vec2<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1753,7 +1749,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec2AndVec3) {
-    WrapInFunction(vec4<f32>(Source{{12, 34}}, vec2<f32>(), vec3<f32>()));
+    WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec2<f32>>(), Call<vec3<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1762,7 +1758,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_TooManyArgumentsVec3AndVec3) {
-    WrapInFunction(vec4<f32>(Source{{12, 34}}, vec3<f32>(), vec3<f32>()));
+    WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<vec3<f32>>(), Call<vec3<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(
@@ -1771,7 +1767,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Error_InvalidArgumentType) {
-    WrapInFunction(vec4<f32>(Source{{12, 34}}, mat2x2<f32>()));
+    WrapInFunction(Call<vec4<f32>>(Source{{12, 34}}, Call<mat2x2<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1779,7 +1775,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_ZeroValue) {
-    auto* tc = vec4<f32>();
+    auto* tc = Call<vec4<f32>>();
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1791,7 +1787,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4F32_Success_Scalar) {
-    auto* tc = vec4<f32>(1_f, 1_f, 1_f, 1_f);
+    auto* tc = Call<vec4<f32>>(1_f, 1_f, 1_f, 1_f);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1805,7 +1801,7 @@
 TEST_F(ResolverValueConstructorValidationTest, Vec4F16_Success_Scalar) {
     Enable(builtin::Extension::kF16);
 
-    auto* tc = vec4<f16>(1_h, 1_h, 1_h, 1_h);
+    auto* tc = Call<vec4<f16>>(1_h, 1_h, 1_h, 1_h);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1817,7 +1813,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4U32_Success_Scalar) {
-    auto* tc = vec4<u32>(1_u, 1_u, 1_u, 1_u);
+    auto* tc = Call<vec4<u32>>(1_u, 1_u, 1_u, 1_u);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1829,7 +1825,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4I32_Success_Scalar) {
-    auto* tc = vec4<i32>(1_i, 1_i, 1_i, 1_i);
+    auto* tc = Call<vec4<i32>>(1_i, 1_i, 1_i, 1_i);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1841,7 +1837,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4Bool_Success_Scalar) {
-    auto* tc = vec4<bool>(true, false, true, false);
+    auto* tc = Call<vec4<bool>>(true, false, true, false);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1853,7 +1849,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec2ScalarScalar) {
-    auto* tc = vec4<f32>(vec2<f32>(), 1_f, 1_f);
+    auto* tc = Call<vec4<f32>>(Call<vec2<f32>>(), 1_f, 1_f);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1865,7 +1861,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_ScalarVec2Scalar) {
-    auto* tc = vec4<f32>(1_f, vec2<f32>(), 1_f);
+    auto* tc = Call<vec4<f32>>(1_f, Call<vec2<f32>>(), 1_f);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1877,7 +1873,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_ScalarScalarVec2) {
-    auto* tc = vec4<f32>(1_f, 1_f, vec2<f32>());
+    auto* tc = Call<vec4<f32>>(1_f, 1_f, Call<vec2<f32>>());
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1889,7 +1885,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec2AndVec2) {
-    auto* tc = vec4<f32>(vec2<f32>(), vec2<f32>());
+    auto* tc = Call<vec4<f32>>(Call<vec2<f32>>(), Call<vec2<f32>>());
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1901,7 +1897,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec3AndScalar) {
-    auto* tc = vec4<f32>(vec3<f32>(), 1_f);
+    auto* tc = Call<vec4<f32>>(Call<vec3<f32>>(), 1_f);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1913,7 +1909,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_ScalarAndVec3) {
-    auto* tc = vec4<f32>(1_f, vec3<f32>());
+    auto* tc = Call<vec4<f32>>(1_f, Call<vec3<f32>>());
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1925,7 +1921,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Identity) {
-    auto* tc = vec4<f32>(vec4<f32>());
+    auto* tc = Call<vec4<f32>>(Call<vec4<f32>>());
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1937,7 +1933,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4_Success_Vec4TypeConversion) {
-    auto* tc = vec4<f32>(vec4<i32>());
+    auto* tc = Call<vec4<f32>>(Call<vec4<i32>>());
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1949,9 +1945,9 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, NestedVectorConstructors_InnerError) {
-    WrapInFunction(vec4<f32>(vec4<f32>(1_f, 1_f,  //
-                                       vec3<f32>(Source{{12, 34}}, 1_f, 1_f)),
-                             1_f));
+    WrapInFunction(Call<vec4<f32>>(Call<vec4<f32>>(1_f, 1_f,  //
+                                                   Call<vec3<f32>>(Source{{12, 34}}, 1_f, 1_f)),
+                                   1_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -1959,7 +1955,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, NestedVectorConstructors_Success) {
-    auto* tc = vec4<f32>(vec3<f32>(vec2<f32>(1_f, 1_f), 1_f), 1_f);
+    auto* tc = Call<vec4<f32>>(Call<vec3<f32>>(Call<vec2<f32>>(1_f, 1_f), 1_f), 1_f);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1974,7 +1970,7 @@
     auto* alias = Alias("UnsignedInt", ty.u32());
     GlobalVar("uint_var", ty.Of(alias), builtin::AddressSpace::kPrivate);
 
-    auto* tc = vec2<f32>(Source{{12, 34}}, "uint_var");
+    auto* tc = Call<vec2<f32>>(Source{{12, 34}}, "uint_var");
     WrapInFunction(tc);
 
     EXPECT_FALSE(r()->Resolve());
@@ -1987,7 +1983,7 @@
     GlobalVar("my_f32", ty.Of(f32_alias), builtin::AddressSpace::kPrivate);
     GlobalVar("my_vec2", ty.Of(vec2_alias), builtin::AddressSpace::kPrivate);
 
-    auto* tc = vec3<f32>("my_vec2", "my_f32");
+    auto* tc = Call<vec3<f32>>("my_vec2", "my_f32");
     WrapInFunction(tc);
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 }
@@ -2020,7 +2016,7 @@
 
     // vec3<u32>(vec<Float32>(), 1.0f)
     auto vec_type = ty.vec(ty.Of(f32_alias), 2);
-    WrapInFunction(vec3<u32>(Source{{12, 34}}, Call(vec_type), 1_f));
+    WrapInFunction(Call<vec3<u32>>(Source{{12, 34}}, Call(vec_type), 1_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_THAT(r()->error(),
@@ -2032,7 +2028,7 @@
 
     // vec3<f32>(vec<Float32>(), 1.0f)
     auto vec_type = ty.vec(ty.Of(f32_alias), 2);
-    auto* tc = vec3<f32>(Call(Source{{12, 34}}, vec_type), 1_f);
+    auto* tc = Call<vec3<f32>>(Call(Source{{12, 34}}, vec_type), 1_f);
     WrapInFunction(tc);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -2041,11 +2037,11 @@
 TEST_F(ResolverValueConstructorValidationTest, InferVec2ElementTypeFromScalars) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec2_bool = vec2<Infer>(true, false);
-    auto* vec2_i32 = vec2<Infer>(1_i, 2_i);
-    auto* vec2_u32 = vec2<Infer>(1_u, 2_u);
-    auto* vec2_f32 = vec2<Infer>(1_f, 2_f);
-    auto* vec2_f16 = vec2<Infer>(1_h, 2_h);
+    auto* vec2_bool = Call<vec2<Infer>>(true, false);
+    auto* vec2_i32 = Call<vec2<Infer>>(1_i, 2_i);
+    auto* vec2_u32 = Call<vec2<Infer>>(1_u, 2_u);
+    auto* vec2_f32 = Call<vec2<Infer>>(1_f, 2_f);
+    auto* vec2_f16 = Call<vec2<Infer>>(1_h, 2_h);
     WrapInFunction(vec2_bool, vec2_i32, vec2_u32, vec2_f32, vec2_f16);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -2070,11 +2066,11 @@
 TEST_F(ResolverValueConstructorValidationTest, InferVec2ElementTypeFromVec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec2_bool = vec2<Infer>(vec2<bool>(true, false));
-    auto* vec2_i32 = vec2<Infer>(vec2<i32>(1_i, 2_i));
-    auto* vec2_u32 = vec2<Infer>(vec2<u32>(1_u, 2_u));
-    auto* vec2_f32 = vec2<Infer>(vec2<f32>(1_f, 2_f));
-    auto* vec2_f16 = vec2<Infer>(vec2<f16>(1_h, 2_h));
+    auto* vec2_bool = Call<vec2<Infer>>(Call<vec2<bool>>(true, false));
+    auto* vec2_i32 = Call<vec2<Infer>>(Call<vec2<i32>>(1_i, 2_i));
+    auto* vec2_u32 = Call<vec2<Infer>>(Call<vec2<u32>>(1_u, 2_u));
+    auto* vec2_f32 = Call<vec2<Infer>>(Call<vec2<f32>>(1_f, 2_f));
+    auto* vec2_f16 = Call<vec2<Infer>>(Call<vec2<f16>>(1_h, 2_h));
     WrapInFunction(vec2_bool, vec2_i32, vec2_u32, vec2_f32, vec2_f16);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -2099,11 +2095,11 @@
 TEST_F(ResolverValueConstructorValidationTest, InferVec3ElementTypeFromScalars) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec3_bool = vec3<Infer>(Expr(true), Expr(false), Expr(true));
-    auto* vec3_i32 = vec3<Infer>(Expr(1_i), Expr(2_i), Expr(3_i));
-    auto* vec3_u32 = vec3<Infer>(Expr(1_u), Expr(2_u), Expr(3_u));
-    auto* vec3_f32 = vec3<Infer>(Expr(1_f), Expr(2_f), Expr(3_f));
-    auto* vec3_f16 = vec3<Infer>(Expr(1_h), Expr(2_h), Expr(3_h));
+    auto* vec3_bool = Call<vec3<Infer>>(true, false, true);
+    auto* vec3_i32 = Call<vec3<Infer>>(1_i, 2_i, 3_i);
+    auto* vec3_u32 = Call<vec3<Infer>>(1_u, 2_u, 3_u);
+    auto* vec3_f32 = Call<vec3<Infer>>(1_f, 2_f, 3_f);
+    auto* vec3_f16 = Call<vec3<Infer>>(1_h, 2_h, 3_h);
     WrapInFunction(vec3_bool, vec3_i32, vec3_u32, vec3_f32, vec3_f16);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -2128,11 +2124,11 @@
 TEST_F(ResolverValueConstructorValidationTest, InferVec3ElementTypeFromVec3) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec3_bool = vec3<Infer>(vec3<bool>(true, false, true));
-    auto* vec3_i32 = vec3<Infer>(vec3<i32>(1_i, 2_i, 3_i));
-    auto* vec3_u32 = vec3<Infer>(vec3<u32>(1_u, 2_u, 3_u));
-    auto* vec3_f32 = vec3<Infer>(vec3<f32>(1_f, 2_f, 3_f));
-    auto* vec3_f16 = vec3<Infer>(vec3<f16>(1_h, 2_h, 3_h));
+    auto* vec3_bool = Call<vec3<Infer>>(Call<vec3<bool>>(true, false, true));
+    auto* vec3_i32 = Call<vec3<Infer>>(Call<vec3<i32>>(1_i, 2_i, 3_i));
+    auto* vec3_u32 = Call<vec3<Infer>>(Call<vec3<u32>>(1_u, 2_u, 3_u));
+    auto* vec3_f32 = Call<vec3<Infer>>(Call<vec3<f32>>(1_f, 2_f, 3_f));
+    auto* vec3_f16 = Call<vec3<Infer>>(Call<vec3<f16>>(1_h, 2_h, 3_h));
     WrapInFunction(vec3_bool, vec3_i32, vec3_u32, vec3_f32, vec3_f16);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -2157,11 +2153,11 @@
 TEST_F(ResolverValueConstructorValidationTest, InferVec3ElementTypeFromScalarAndVec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec3_bool = vec3<Infer>(Expr(true), vec2<bool>(false, true));
-    auto* vec3_i32 = vec3<Infer>(Expr(1_i), vec2<i32>(2_i, 3_i));
-    auto* vec3_u32 = vec3<Infer>(Expr(1_u), vec2<u32>(2_u, 3_u));
-    auto* vec3_f32 = vec3<Infer>(Expr(1_f), vec2<f32>(2_f, 3_f));
-    auto* vec3_f16 = vec3<Infer>(Expr(1_h), vec2<f16>(2_h, 3_h));
+    auto* vec3_bool = Call<vec3<Infer>>(true, Call<vec2<bool>>(false, true));
+    auto* vec3_i32 = Call<vec3<Infer>>(1_i, Call<vec2<i32>>(2_i, 3_i));
+    auto* vec3_u32 = Call<vec3<Infer>>(1_u, Call<vec2<u32>>(2_u, 3_u));
+    auto* vec3_f32 = Call<vec3<Infer>>(1_f, Call<vec2<f32>>(2_f, 3_f));
+    auto* vec3_f16 = Call<vec3<Infer>>(1_h, Call<vec2<f16>>(2_h, 3_h));
     WrapInFunction(vec3_bool, vec3_i32, vec3_u32, vec3_f32, vec3_f16);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -2186,11 +2182,11 @@
 TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromScalars) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec4_bool = vec4<Infer>(Expr(true), Expr(false), Expr(true), Expr(false));
-    auto* vec4_i32 = vec4<Infer>(Expr(1_i), Expr(2_i), Expr(3_i), Expr(4_i));
-    auto* vec4_u32 = vec4<Infer>(Expr(1_u), Expr(2_u), Expr(3_u), Expr(4_u));
-    auto* vec4_f32 = vec4<Infer>(Expr(1_f), Expr(2_f), Expr(3_f), Expr(4_f));
-    auto* vec4_f16 = vec4<Infer>(Expr(1_h), Expr(2_h), Expr(3_h), Expr(4_h));
+    auto* vec4_bool = Call<vec4<Infer>>(true, false, true, false);
+    auto* vec4_i32 = Call<vec4<Infer>>(1_i, 2_i, 3_i, 4_i);
+    auto* vec4_u32 = Call<vec4<Infer>>(1_u, 2_u, 3_u, 4_u);
+    auto* vec4_f32 = Call<vec4<Infer>>(1_f, 2_f, 3_f, 4_f);
+    auto* vec4_f16 = Call<vec4<Infer>>(1_h, 2_h, 3_h, 4_h);
     WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32, vec4_f16);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -2215,11 +2211,11 @@
 TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromVec4) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec4_bool = vec4<Infer>(vec4<bool>(true, false, true, false));
-    auto* vec4_i32 = vec4<Infer>(vec4<i32>(1_i, 2_i, 3_i, 4_i));
-    auto* vec4_u32 = vec4<Infer>(vec4<u32>(1_u, 2_u, 3_u, 4_u));
-    auto* vec4_f32 = vec4<Infer>(vec4<f32>(1_f, 2_f, 3_f, 4_f));
-    auto* vec4_f16 = vec4<Infer>(vec4<f16>(1_h, 2_h, 3_h, 4_h));
+    auto* vec4_bool = Call<vec4<Infer>>(Call<vec4<bool>>(true, false, true, false));
+    auto* vec4_i32 = Call<vec4<Infer>>(Call<vec4<i32>>(1_i, 2_i, 3_i, 4_i));
+    auto* vec4_u32 = Call<vec4<Infer>>(Call<vec4<u32>>(1_u, 2_u, 3_u, 4_u));
+    auto* vec4_f32 = Call<vec4<Infer>>(Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f));
+    auto* vec4_f16 = Call<vec4<Infer>>(Call<vec4<f16>>(1_h, 2_h, 3_h, 4_h));
     WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32, vec4_f16);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -2244,11 +2240,11 @@
 TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromScalarAndVec3) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec4_bool = vec4<Infer>(Expr(true), vec3<bool>(false, true, false));
-    auto* vec4_i32 = vec4<Infer>(Expr(1_i), vec3<i32>(2_i, 3_i, 4_i));
-    auto* vec4_u32 = vec4<Infer>(Expr(1_u), vec3<u32>(2_u, 3_u, 4_u));
-    auto* vec4_f32 = vec4<Infer>(Expr(1_f), vec3<f32>(2_f, 3_f, 4_f));
-    auto* vec4_f16 = vec4<Infer>(Expr(1_h), vec3<f16>(2_h, 3_h, 4_h));
+    auto* vec4_bool = Call<vec4<Infer>>(true, Call<vec3<bool>>(false, true, false));
+    auto* vec4_i32 = Call<vec4<Infer>>(1_i, Call<vec3<i32>>(2_i, 3_i, 4_i));
+    auto* vec4_u32 = Call<vec4<Infer>>(1_u, Call<vec3<u32>>(2_u, 3_u, 4_u));
+    auto* vec4_f32 = Call<vec4<Infer>>(1_f, Call<vec3<f32>>(2_f, 3_f, 4_f));
+    auto* vec4_f16 = Call<vec4<Infer>>(1_h, Call<vec3<f16>>(2_h, 3_h, 4_h));
     WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32, vec4_f16);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -2273,11 +2269,12 @@
 TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromVec2AndVec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec4_bool = vec4<Infer>(vec2<bool>(true, false), vec2<bool>(true, false));
-    auto* vec4_i32 = vec4<Infer>(vec2<i32>(1_i, 2_i), vec2<i32>(3_i, 4_i));
-    auto* vec4_u32 = vec4<Infer>(vec2<u32>(1_u, 2_u), vec2<u32>(3_u, 4_u));
-    auto* vec4_f32 = vec4<Infer>(vec2<f32>(1_f, 2_f), vec2<f32>(3_f, 4_f));
-    auto* vec4_f16 = vec4<Infer>(vec2<f16>(1_h, 2_h), vec2<f16>(3_h, 4_h));
+    auto* vec4_bool =
+        Call<vec4<Infer>>(Call<vec2<bool>>(true, false), Call<vec2<bool>>(true, false));
+    auto* vec4_i32 = Call<vec4<Infer>>(Call<vec2<i32>>(1_i, 2_i), Call<vec2<i32>>(3_i, 4_i));
+    auto* vec4_u32 = Call<vec4<Infer>>(Call<vec2<u32>>(1_u, 2_u), Call<vec2<u32>>(3_u, 4_u));
+    auto* vec4_f32 = Call<vec4<Infer>>(Call<vec2<f32>>(1_f, 2_f), Call<vec2<f32>>(3_f, 4_f));
+    auto* vec4_f16 = Call<vec4<Infer>>(Call<vec2<f16>>(1_h, 2_h), Call<vec2<f16>>(3_h, 4_h));
     WrapInFunction(vec4_bool, vec4_i32, vec4_u32, vec4_f32, vec4_f16);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -2300,9 +2297,9 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVecNoArgs) {
-    auto* v2 = vec2<Infer>();
-    auto* v3 = vec3<Infer>();
-    auto* v4 = vec4<Infer>();
+    auto* v2 = Call<vec2<Infer>>();
+    auto* v3 = Call<vec3<Infer>>();
+    auto* v4 = Call<vec4<Infer>>();
 
     GlobalConst("v2", v2);
     GlobalConst("v3", v3);
@@ -2409,8 +2406,8 @@
         DataType<T>::Name,
         DataType<T>::AST,
         DataType<T>::ExprFromDouble,
-        DataType<tint::resolver::builder::vec<R, T>>::AST,
-        DataType<tint::resolver::builder::mat<C, R, T>>::AST,
+        DataType<vec<R, T>>::AST,
+        DataType<mat<C, R, T>>::AST,
     };
 }
 
@@ -2776,7 +2773,7 @@
 
 TEST_F(ResolverValueConstructorValidationTest, MatrixConstructor_ArgumentTypeAlias_Error) {
     auto* alias = Alias("VectorUnsigned2", ty.vec2<u32>());
-    auto* tc = Call(Source{{12, 34}}, ty.mat2x2<f32>(), Call(ty.Of(alias)), vec2<f32>());
+    auto* tc = Call(Source{{12, 34}}, ty.mat2x2<f32>(), Call(ty.Of(alias)), Call<vec2<f32>>());
     WrapInFunction(tc);
 
     EXPECT_FALSE(r()->Resolve());
@@ -2973,12 +2970,6 @@
 namespace StructConstructor {
 using builder::CreatePtrs;
 using builder::CreatePtrsFor;
-using builder::mat2x2;
-using builder::mat3x3;
-using builder::mat4x4;
-using builder::vec2;
-using builder::vec3;
-using builder::vec4;
 
 constexpr CreatePtrs all_types[] = {
     CreatePtrsFor<bool>(),         //
@@ -3170,7 +3161,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, BuilinTypeConstructorAsStatement) {
-    WrapInFunction(CallStmt(vec2<f32>(Source{{12, 34}}, 1_f, 2_f)));
+    WrapInFunction(CallStmt(Call<vec2<f32>>(Source{{12, 34}}, 1_f, 2_f)));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(), "12:34 error: value constructor evaluated but not used");
diff --git a/src/tint/resolver/variable_test.cc b/src/tint/resolver/variable_test.cc
index 7095cfe..2054885 100644
--- a/src/tint/resolver/variable_test.cc
+++ b/src/tint/resolver/variable_test.cc
@@ -21,7 +21,8 @@
 namespace tint::resolver {
 namespace {
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 struct ResolverVariableTest : public resolver::TestHelper, public testing::Test {};
 
@@ -421,7 +422,7 @@
     auto* b = Let("b", ty.bool_(), b_c);
     auto* s = Let("s", ty.Of(S), s_c);
     auto* a = Let("a", ty.Of(A), a_c);
-    auto* p = Let("p", ty.ptr<i32>(builtin::AddressSpace::kFunction), p_c);
+    auto* p = Let("p", ty.ptr<function, i32>(), p_c);
 
     Func("F", utils::Empty, ty.void_(),
          utils::Vector{
@@ -898,10 +899,10 @@
     auto* c_i32 = Const("a", ty.i32(), Expr(0_i));
     auto* c_u32 = Const("b", ty.u32(), Expr(0_u));
     auto* c_f32 = Const("c", ty.f32(), Expr(0_f));
-    auto* c_vi32 = Const("d", ty.vec3<i32>(), vec3<i32>());
-    auto* c_vu32 = Const("e", ty.vec3<u32>(), vec3<u32>());
-    auto* c_vf32 = Const("f", ty.vec3<f32>(), vec3<f32>());
-    auto* c_mf32 = Const("g", ty.mat3x3<f32>(), mat3x3<f32>());
+    auto* c_vi32 = Const("d", ty.vec3<i32>(), Call<vec3<i32>>());
+    auto* c_vu32 = Const("e", ty.vec3<u32>(), Call<vec3<u32>>());
+    auto* c_vf32 = Const("f", ty.vec3<f32>(), Call<vec3<f32>>());
+    auto* c_mf32 = Const("g", ty.mat3x3<f32>(), Call<mat3x3<f32>>());
     auto* c_s = Const("h", ty("S"), Call("S"));
 
     WrapInFunction(c_i32, c_u32, c_f32, c_vi32, c_vu32, c_vf32, c_mf32, c_s);
@@ -944,16 +945,16 @@
     auto* c_f32 = Const("c", Expr(0_f));
     auto* c_ai = Const("d", Expr(0_a));
     auto* c_af = Const("e", Expr(0._a));
-    auto* c_vi32 = Const("f", vec3<i32>());
-    auto* c_vu32 = Const("g", vec3<u32>());
-    auto* c_vf32 = Const("h", vec3<f32>());
-    auto* c_vai = Const("i", Call(ty.vec<Infer>(3), Expr(0_a)));
-    auto* c_vaf = Const("j", Call(ty.vec<Infer>(3), Expr(0._a)));
-    auto* c_mf32 = Const("k", mat3x3<f32>());
-    auto* c_maf32 =
-        Const("l", Call(ty.mat3x3<Infer>(),  //
-                        Call(ty.vec<Infer>(3), Expr(0._a)), Call(ty.vec<Infer>(3), Expr(0._a)),
-                        Call(ty.vec<Infer>(3), Expr(0._a))));
+    auto* c_vi32 = Const("f", Call<vec3<i32>>());
+    auto* c_vu32 = Const("g", Call<vec3<u32>>());
+    auto* c_vf32 = Const("h", Call<vec3<f32>>());
+    auto* c_vai = Const("i", Call<vec3<Infer>>(0_a));
+    auto* c_vaf = Const("j", Call<vec3<Infer>>(0._a));
+    auto* c_mf32 = Const("k", Call<mat3x3<f32>>());
+    auto* c_maf32 = Const("l", Call<mat3x3<Infer>>(          //
+                                   Call<vec3<Infer>>(0._a),  //
+                                   Call<vec3<Infer>>(0._a),  //
+                                   Call<vec3<Infer>>(0._a)));
     auto* c_s = Const("m", Call("S"));
 
     WrapInFunction(c_i32, c_u32, c_f32, c_ai, c_af, c_vi32, c_vu32, c_vf32, c_vai, c_vaf, c_mf32,
@@ -1082,10 +1083,10 @@
     auto* c_i32 = GlobalConst("a", ty.i32(), Expr(0_i));
     auto* c_u32 = GlobalConst("b", ty.u32(), Expr(0_u));
     auto* c_f32 = GlobalConst("c", ty.f32(), Expr(0_f));
-    auto* c_vi32 = GlobalConst("d", ty.vec3<i32>(), vec3<i32>());
-    auto* c_vu32 = GlobalConst("e", ty.vec3<u32>(), vec3<u32>());
-    auto* c_vf32 = GlobalConst("f", ty.vec3<f32>(), vec3<f32>());
-    auto* c_mf32 = GlobalConst("g", ty.mat3x3<f32>(), mat3x3<f32>());
+    auto* c_vi32 = GlobalConst("d", ty.vec3<i32>(), Call<vec3<i32>>());
+    auto* c_vu32 = GlobalConst("e", ty.vec3<u32>(), Call<vec3<u32>>());
+    auto* c_vf32 = GlobalConst("f", ty.vec3<f32>(), Call<vec3<f32>>());
+    auto* c_mf32 = GlobalConst("g", ty.mat3x3<f32>(), Call<mat3x3<f32>>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
@@ -1120,16 +1121,16 @@
     auto* c_f32 = GlobalConst("c", Expr(0_f));
     auto* c_ai = GlobalConst("d", Expr(0_a));
     auto* c_af = GlobalConst("e", Expr(0._a));
-    auto* c_vi32 = GlobalConst("f", vec3<i32>());
-    auto* c_vu32 = GlobalConst("g", vec3<u32>());
-    auto* c_vf32 = GlobalConst("h", vec3<f32>());
-    auto* c_vai = GlobalConst("i", Call(ty.vec<Infer>(3), Expr(0_a)));
-    auto* c_vaf = GlobalConst("j", Call(ty.vec<Infer>(3), Expr(0._a)));
-    auto* c_mf32 = GlobalConst("k", mat3x3<f32>());
-    auto* c_maf32 = GlobalConst(
-        "l", Call(ty.mat3x3<Infer>(),  //
-                  Call(ty.vec<Infer>(3), Expr(0._a)), Call(ty.vec<Infer>(3), Expr(0._a)),
-                  Call(ty.vec<Infer>(3), Expr(0._a))));
+    auto* c_vi32 = GlobalConst("f", Call<vec3<i32>>());
+    auto* c_vu32 = GlobalConst("g", Call<vec3<u32>>());
+    auto* c_vf32 = GlobalConst("h", Call<vec3<f32>>());
+    auto* c_vai = GlobalConst("i", Call<vec3<Infer>>(0_a));
+    auto* c_vaf = GlobalConst("j", Call<vec3<Infer>>(0._a));
+    auto* c_mf32 = GlobalConst("k", Call<mat3x3<f32>>());
+    auto* c_maf32 = GlobalConst("l", Call<mat3x3<Infer>>(          //
+                                         Call<vec3<Infer>>(0._a),  //
+                                         Call<vec3<Infer>>(0._a),  //
+                                         Call<vec3<Infer>>(0._a)));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
 
diff --git a/src/tint/resolver/variable_validation_test.cc b/src/tint/resolver/variable_validation_test.cc
index 9656574..d29f8b0 100644
--- a/src/tint/resolver/variable_validation_test.cc
+++ b/src/tint/resolver/variable_validation_test.cc
@@ -17,7 +17,8 @@
 #include "src/tint/resolver/resolver_test_helper.h"
 #include "src/tint/type/texture_dimension.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::resolver {
 namespace {
@@ -132,8 +133,8 @@
     // var i : i32;
     // var p : pointer<function, i32> = &v;
     auto* i = Var("i", ty.i32());
-    auto* p = Var("a", ty.ptr<i32>(Source{{56, 78}}, builtin::AddressSpace::kFunction),
-                  builtin::AddressSpace::kUndefined, AddressOf(Source{{12, 34}}, "i"));
+    auto* p = Var("a", ty.ptr<function, i32>(Source{{56, 78}}), builtin::AddressSpace::kUndefined,
+                  AddressOf(Source{{12, 34}}, "i"));
     WrapInFunction(i, p);
 
     EXPECT_FALSE(r()->Resolve());
@@ -162,7 +163,7 @@
 
 TEST_F(ResolverVariableValidationTest, OverrideInferedTypeNotScalar) {
     // override o = vec3(1.0f);
-    Override(Source{{56, 78}}, "o", vec3<f32>(1.0_f));
+    Override(Source{{56, 78}}, "o", Call<vec3<f32>>(1.0_f));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(), "56:78 error: vec3<f32> cannot be used as the type of a 'override'");
@@ -314,13 +315,11 @@
     auto* buf = Structure("S", utils::Vector{
                                    Member("inner", ty.Of(inner)),
                                });
-    auto* storage =
+    auto* var =
         GlobalVar("s", ty.Of(buf), builtin::AddressSpace::kStorage, Binding(0_a), Group(0_a));
 
-    auto* expr = IndexAccessor(MemberAccessor(MemberAccessor(storage, "inner"), "arr"), 2_i);
-    auto* ptr = Let(Source{{12, 34}}, "p",
-                    ty.ptr<i32>(builtin::AddressSpace::kStorage, builtin::Access::kReadWrite),
-                    AddressOf(expr));
+    auto* expr = IndexAccessor(MemberAccessor(MemberAccessor(var, "inner"), "arr"), 2_i);
+    auto* ptr = Let(Source{{12, 34}}, "p", ty.ptr<storage, i32, read_write>(), AddressOf(expr));
 
     WrapInFunction(ptr);
 
@@ -390,7 +389,7 @@
 
 TEST_F(ResolverVariableValidationTest, VectorConstNoType) {
     // const a vec3 = vec3<f32>();
-    WrapInFunction(Const("a", ty.vec3<Infer>(Source{{12, 34}}), vec3<f32>()));
+    WrapInFunction(Const("a", ty.vec3<Infer>(Source{{12, 34}}), Call<vec3<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(), "12:34 error: expected '<' for 'vec3'");
@@ -398,7 +397,7 @@
 
 TEST_F(ResolverVariableValidationTest, VectorLetNoType) {
     // let a : vec3 = vec3<f32>();
-    WrapInFunction(Let("a", ty.vec3<Infer>(Source{{12, 34}}), vec3<f32>()));
+    WrapInFunction(Let("a", ty.vec3<Infer>(Source{{12, 34}}), Call<vec3<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(), "12:34 error: expected '<' for 'vec3'");
@@ -414,7 +413,7 @@
 
 TEST_F(ResolverVariableValidationTest, MatrixConstNoType) {
     // const a : mat3x3 = mat3x3<f32>();
-    WrapInFunction(Const("a", ty.mat3x3<Infer>(Source{{12, 34}}), mat3x3<f32>()));
+    WrapInFunction(Const("a", ty.mat3x3<Infer>(Source{{12, 34}}), Call<mat3x3<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(), "12:34 error: expected '<' for 'mat3x3'");
@@ -422,7 +421,7 @@
 
 TEST_F(ResolverVariableValidationTest, MatrixLetNoType) {
     // let a : mat3x3 = mat3x3<f32>();
-    WrapInFunction(Let("a", ty.mat3x3<Infer>(Source{{12, 34}}), mat3x3<f32>()));
+    WrapInFunction(Let("a", ty.mat3x3<Infer>(Source{{12, 34}}), Call<mat3x3<f32>>()));
 
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(), "12:34 error: expected '<' for 'mat3x3'");
diff --git a/src/tint/sem/statement.h b/src/tint/sem/statement.h
index 87214a2..1d9b6cb 100644
--- a/src/tint/sem/statement.h
+++ b/src/tint/sem/statement.h
@@ -88,7 +88,7 @@
     /// pointer to that template argument type, otherwise a CompoundStatement
     /// pointer is returned.
     template <typename... TYPES>
-    const detail::FindFirstParentReturnType<TYPES...>* FindFirstParent() const;
+    const sem::detail::FindFirstParentReturnType<TYPES...>* FindFirstParent() const;
 
     /// @return the closest enclosing block for this statement
     const BlockStatement* Block() const;
@@ -181,8 +181,8 @@
 }
 
 template <typename... TYPES>
-const detail::FindFirstParentReturnType<TYPES...>* Statement::FindFirstParent() const {
-    using ReturnType = detail::FindFirstParentReturnType<TYPES...>;
+const sem::detail::FindFirstParentReturnType<TYPES...>* Statement::FindFirstParent() const {
+    using ReturnType = sem::detail::FindFirstParentReturnType<TYPES...>;
     if (sizeof...(TYPES) == 1) {
         if (auto* p = As<ReturnType>()) {
             return p;
diff --git a/src/tint/switch.h b/src/tint/switch.h
index df5bd95..4073bb8 100644
--- a/src/tint/switch.h
+++ b/src/tint/switch.h
@@ -110,8 +110,8 @@
 template <typename... CASE_RETURN_TYPES>
 struct SwitchReturnTypeImpl</*IS_CASTABLE*/ true, utils::detail::Infer, CASE_RETURN_TYPES...> {
   private:
-    using InferredType = utils::CastableCommonBase<
-        detail::NullptrToIgnore<std::remove_pointer_t<CASE_RETURN_TYPES>>...>;
+    using InferredType =
+        utils::CastableCommonBase<NullptrToIgnore<std::remove_pointer_t<CASE_RETURN_TYPES>>...>;
 
   public:
     /// `const T*` or `T*`, where T is the common base type for all the castable case types.
@@ -166,8 +166,9 @@
           typename T = utils::CastableBase,
           typename... CASES>
 inline auto Switch(T* object, CASES&&... cases) {
-    using ReturnType = detail::SwitchReturnType<RETURN_TYPE, utils::traits::ReturnType<CASES>...>;
-    static constexpr int kDefaultIndex = detail::IndexOfDefaultCase<std::tuple<CASES...>>();
+    using ReturnType =
+        tint::detail::SwitchReturnType<RETURN_TYPE, utils::traits::ReturnType<CASES>...>;
+    static constexpr int kDefaultIndex = tint::detail::IndexOfDefaultCase<std::tuple<CASES...>>();
     static constexpr bool kHasDefaultCase = kDefaultIndex >= 0;
     static constexpr bool kHasReturnType = !std::is_same_v<ReturnType, void>;
 
@@ -202,8 +203,8 @@
     struct alignas(alignof(ReturnTypeOrU8)) ReturnStorage {
         uint8_t data[sizeof(ReturnTypeOrU8)];
     };
-    ReturnStorage storage;
-    auto* result = utils::Bitcast<ReturnTypeOrU8*>(&storage);
+    ReturnStorage return_storage;
+    auto* result = utils::Bitcast<ReturnTypeOrU8*>(&return_storage);
 
     const utils::TypeInfo& type_info = object->TypeInfo();
 
@@ -217,7 +218,7 @@
     // `result` pointer.
     auto try_case = [&](auto&& case_fn) {
         using CaseFunc = std::decay_t<decltype(case_fn)>;
-        using CaseType = detail::SwitchCaseType<CaseFunc>;
+        using CaseType = tint::detail::SwitchCaseType<CaseFunc>;
         bool success = false;
         if constexpr (std::is_same_v<CaseType, Default>) {
             if constexpr (kHasReturnType) {
diff --git a/src/tint/type/manager.cc b/src/tint/type/manager.cc
index f5f382b..97e69d1 100644
--- a/src/tint/type/manager.cc
+++ b/src/tint/type/manager.cc
@@ -158,7 +158,7 @@
 
 const type::Pointer* Manager::ptr(builtin::AddressSpace address_space,
                                   const type::Type* subtype,
-                                  builtin::Access access) {
+                                  builtin::Access access /* = builtin::Access::kReadWrite */) {
     return Get<type::Pointer>(address_space, subtype, access);
 }
 
diff --git a/src/tint/type/manager.h b/src/tint/type/manager.h
index a9bdbeb..31f49d8 100644
--- a/src/tint/type/manager.h
+++ b/src/tint/type/manager.h
@@ -19,7 +19,8 @@
 
 #include "src/tint/builtin/access.h"
 #include "src/tint/builtin/address_space.h"
-#include "src/tint/number.h"
+#include "src/tint/builtin/fluent_types.h"
+#include "src/tint/builtin/number.h"
 #include "src/tint/type/type.h"
 #include "src/tint/type/unique_node.h"
 #include "src/tint/utils/hash.h"
@@ -43,9 +44,6 @@
 
 namespace tint::type {
 
-template <typename T>
-struct CppToType;
-
 /// The type manager holds all the pointers to the known types.
 class Manager final {
   public:
@@ -92,10 +90,31 @@
     /// the same pointer is returned.
     template <typename T, typename... ARGS>
     auto* Get(ARGS&&... args) {
-        using N = ToType<T>;
-        if constexpr (utils::traits::IsTypeOrDerived<N, Type>) {
-            return types_.Get<N>(std::forward<ARGS>(args)...);
-        } else if constexpr (utils::traits::IsTypeOrDerived<N, UniqueNode>) {
+        if constexpr (std::is_same_v<T, tint::AInt>) {
+            return Get<type::AbstractInt>(std::forward<ARGS>(args)...);
+        } else if constexpr (std::is_same_v<T, tint::AFloat>) {
+            return Get<type::AbstractFloat>(std::forward<ARGS>(args)...);
+        } else if constexpr (std::is_same_v<T, tint::i32>) {
+            return Get<type::I32>(std::forward<ARGS>(args)...);
+        } else if constexpr (std::is_same_v<T, tint::u32>) {
+            return Get<type::U32>(std::forward<ARGS>(args)...);
+        } else if constexpr (std::is_same_v<T, tint::f32>) {
+            return Get<type::F32>(std::forward<ARGS>(args)...);
+        } else if constexpr (std::is_same_v<T, tint::f16>) {
+            return Get<type::F16>(std::forward<ARGS>(args)...);
+        } else if constexpr (std::is_same_v<T, bool>) {
+            return Get<type::Bool>(std::forward<ARGS>(args)...);
+        } else if constexpr (builtin::fluent_types::IsVector<T>) {
+            return vec<typename T::type, T::width>(std::forward<ARGS>(args)...);
+        } else if constexpr (builtin::fluent_types::IsMatrix<T>) {
+            return mat<T::columns, T::rows, typename T::type>(std::forward<ARGS>(args)...);
+        } else if constexpr (builtin::fluent_types::IsPointer<T>) {
+            return ptr<T::address, typename T::type, T::access>(std::forward<ARGS>(args)...);
+        } else if constexpr (builtin::fluent_types::IsArray<T>) {
+            return array<typename T::type, T::length>(std::forward<ARGS>(args)...);
+        } else if constexpr (utils::traits::IsTypeOrDerived<T, Type>) {
+            return types_.Get<T>(std::forward<ARGS>(args)...);
+        } else if constexpr (utils::traits::IsTypeOrDerived<T, UniqueNode>) {
             return unique_nodes_.Get<T>(std::forward<ARGS>(args)...);
         } else {
             return nodes_.Create<T>(std::forward<ARGS>(args)...);
@@ -158,6 +177,7 @@
     /// @returns the vector type
     template <typename T, size_t N>
     const type::Vector* vec() {
+        TINT_BEGIN_DISABLE_WARNING(UNREACHABLE_CODE);
         static_assert(N >= 2 && N <= 4);
         switch (N) {
             case 2:
@@ -167,6 +187,8 @@
             case 4:
                 return vec4<T>();
         }
+        return nullptr;  // unreachable
+        TINT_END_DISABLE_WARNING(UNREACHABLE_CODE);
     }
 
     /// @tparam T the element type
@@ -295,6 +317,24 @@
         return mat4x4(Get<T>());
     }
 
+    /// @param columns the number of columns of the matrix
+    /// @param rows the number of rows of the matrix
+    /// @tparam T the element type
+    /// @returns a matrix with the given number of columns and rows
+    template <typename T>
+    const type::Matrix* mat(uint32_t columns, uint32_t rows) {
+        return mat(Get<T>(), columns, rows);
+    }
+
+    /// @tparam C the number of columns in the matrix
+    /// @tparam R the number of rows in the matrix
+    /// @tparam T the element type
+    /// @returns a matrix with the given number of columns and rows
+    template <uint32_t C, uint32_t R, typename T>
+    const type::Matrix* mat() {
+        return mat(Get<T>(), C, R);
+    }
+
     /// @param elem_ty the array element type
     /// @param count the array element count
     /// @param stride the optional array element stride
@@ -325,7 +365,7 @@
     /// @returns the pointer type
     const type::Pointer* ptr(builtin::AddressSpace address_space,
                              const type::Type* subtype,
-                             builtin::Access access);
+                             builtin::Access access = builtin::Access::kReadWrite);
 
     /// @tparam SPACE the address space
     /// @tparam T the storage type
@@ -338,6 +378,15 @@
         return ptr(SPACE, Get<T>(), ACCESS);
     }
 
+    /// @param subtype the pointer subtype
+    /// @tparam SPACE the address space
+    /// @tparam ACCESS the access mode
+    /// @returns the pointer type with the templated address space, storage type and access.
+    template <builtin::AddressSpace SPACE, builtin::Access ACCESS = builtin::Access::kReadWrite>
+    const type::Pointer* ptr(const type::Type* subtype) {
+        return ptr(SPACE, subtype, ACCESS);
+    }
+
     /// @returns an iterator to the beginning of the types
     TypeIterator begin() const { return types_.begin(); }
     /// @returns an iterator to the end of the types
@@ -362,46 +411,6 @@
     utils::BlockAllocator<Node> nodes_;
 };
 
-//! @cond Doxygen_Suppress
-// Various template specializations for Manager::ToTypeImpl.
-template <>
-struct Manager::ToTypeImpl<AInt> {
-    using type = type::AbstractInt;
-};
-template <>
-struct Manager::ToTypeImpl<AFloat> {
-    using type = type::AbstractFloat;
-};
-template <>
-struct Manager::ToTypeImpl<i32> {
-    using type = type::I32;
-};
-template <>
-struct Manager::ToTypeImpl<u32> {
-    using type = type::U32;
-};
-template <>
-struct Manager::ToTypeImpl<f32> {
-    using type = type::F32;
-};
-template <>
-struct Manager::ToTypeImpl<f16> {
-    using type = type::F16;
-};
-template <>
-struct Manager::ToTypeImpl<bool> {
-    using type = type::Bool;
-};
-template <typename T>
-struct Manager::ToTypeImpl<const T> {
-    using type = const Manager::ToType<T>;
-};
-template <typename T>
-struct Manager::ToTypeImpl<T*> {
-    using type = Manager::ToType<T>*;
-};
-//! @endcond
-
 }  // namespace tint::type
 
 #endif  // SRC_TINT_TYPE_MANAGER_H_
diff --git a/src/tint/utils/castable.cc b/src/tint/utils/castable.cc
index b7756b3..484014f 100644
--- a/src/tint/utils/castable.cc
+++ b/src/tint/utils/castable.cc
@@ -19,7 +19,7 @@
 /// The unique TypeInfo for the CastableBase type
 /// @return doxygen-thinks-this-static-field-is-a-function :(
 template <>
-const TypeInfo detail::TypeInfoOf<CastableBase>::info{
+const TypeInfo utils::detail::TypeInfoOf<CastableBase>::info{
     nullptr,
     "CastableBase",
     tint::utils::TypeInfo::HashCodeOf<CastableBase>(),
diff --git a/src/tint/utils/castable.h b/src/tint/utils/castable.h
index f402c1c..176b107 100644
--- a/src/tint/utils/castable.h
+++ b/src/tint/utils/castable.h
@@ -176,7 +176,7 @@
     /// @returns the static TypeInfo for the type T
     template <typename T>
     static const TypeInfo& Of() {
-        return detail::TypeInfoOf<std::remove_cv_t<T>>::info;
+        return utils::detail::TypeInfoOf<std::remove_cv_t<T>>::info;
     }
 
     /// @returns a compile-time hashcode for the type `T`.
@@ -281,7 +281,7 @@
 /// @returns true if `obj` is a valid pointer, and is of, or derives from the class `TO`
 /// @param obj the object to test from
 /// @see CastFlags
-template <typename TO, int FLAGS = 0, typename FROM = detail::Infer>
+template <typename TO, int FLAGS = 0, typename FROM = utils::detail::Infer>
 inline bool Is(FROM* obj) {
     if (obj == nullptr) {
         return false;
@@ -295,7 +295,10 @@
 /// @param pred predicate function with signature `bool(const TYPE*)` called iff object is of, or
 /// derives from the class `TYPE`.
 /// @see CastFlags
-template <typename TYPE, int FLAGS = 0, typename OBJ = detail::Infer, typename Pred = detail::Infer>
+template <typename TYPE,
+          int FLAGS = 0,
+          typename OBJ = utils::detail::Infer,
+          typename Pred = utils::detail::Infer>
 inline bool Is(OBJ* obj, Pred&& pred) {
     return Is<TYPE, FLAGS, OBJ>(obj) && pred(static_cast<std::add_const_t<TYPE>*>(obj));
 }
@@ -315,7 +318,7 @@
 /// `TO`.
 /// @param obj the object to cast from
 /// @see CastFlags
-template <typename TO, int FLAGS = 0, typename FROM = detail::Infer>
+template <typename TO, int FLAGS = 0, typename FROM = utils::detail::Infer>
 inline TO* As(FROM* obj) {
     auto* as_castable = static_cast<CastableBase*>(obj);
     return Is<TO, FLAGS>(obj) ? static_cast<TO*>(as_castable) : nullptr;
@@ -325,7 +328,7 @@
 /// `TO`.
 /// @param obj the object to cast from
 /// @see CastFlags
-template <typename TO, int FLAGS = 0, typename FROM = detail::Infer>
+template <typename TO, int FLAGS = 0, typename FROM = utils::detail::Infer>
 inline const TO* As(const FROM* obj) {
     auto* as_castable = static_cast<const CastableBase*>(obj);
     return Is<TO, FLAGS>(obj) ? static_cast<const TO*>(as_castable) : nullptr;
@@ -361,7 +364,7 @@
     /// returns true
     /// @param pred predicate function with signature `bool(const TO*)` called iff object is of, or
     /// derives from the class `TO`.
-    template <typename TO, int FLAGS = 0, typename Pred = detail::Infer>
+    template <typename TO, int FLAGS = 0, typename Pred = utils::detail::Infer>
     inline bool Is(Pred&& pred) const {
         return tint::utils::Is<TO, FLAGS>(this, std::forward<Pred>(pred));
     }
@@ -445,7 +448,7 @@
     /// pred(const TO*) returns true
     /// @param pred predicate function with signature `bool(const TO*)` called iff
     /// object is of, or derives from the class `TO`.
-    template <int FLAGS = 0, typename Pred = detail::Infer>
+    template <int FLAGS = 0, typename Pred = utils::detail::Infer>
     inline bool Is(Pred&& pred) const {
         using TO = typename std::remove_pointer<utils::traits::ParameterType<Pred, 0>>::type;
         return tint::utils::Is<TO, FLAGS>(static_cast<const CLASS*>(this),
@@ -534,7 +537,7 @@
 
 /// Resolves to the common most derived type that each of the types in `TYPES` derives from.
 template <typename... TYPES>
-using CastableCommonBase = detail::CastableCommonBase<TYPES...>;
+using CastableCommonBase = utils::detail::CastableCommonBase<TYPES...>;
 
 }  // namespace tint::utils
 
diff --git a/src/tint/utils/hash.h b/src/tint/utils/hash.h
index fe1614e..f02c777 100644
--- a/src/tint/utils/hash.h
+++ b/src/tint/utils/hash.h
@@ -209,7 +209,7 @@
 ///          The returned hash is dependent on the order of the arguments.
 template <typename... ARGS>
 size_t HashCombine(size_t hash, const ARGS&... values) {
-    constexpr size_t offset = detail::HashCombineOffset<sizeof(size_t)>::value();
+    constexpr size_t offset = utils::detail::HashCombineOffset<sizeof(size_t)>::value();
     ((hash ^= Hash(values) + (offset ^ (hash >> 2))), ...);
     return hash;
 }
diff --git a/src/tint/utils/slice.h b/src/tint/utils/slice.h
index ca25949..49483ec 100644
--- a/src/tint/utils/slice.h
+++ b/src/tint/utils/slice.h
@@ -94,7 +94,8 @@
 ///  * `FROM` and `TO` are pointers to CastableBase (or derived), and the pointee type of `TO` is of
 ///     the same type as, or is an ancestor of the pointee type of `FROM`.
 template <ReinterpretMode MODE, typename TO, typename FROM>
-static constexpr bool CanReinterpretSlice = detail::CanReinterpretSlice<MODE, TO, FROM>::value;
+static constexpr bool CanReinterpretSlice =
+    utils::detail::CanReinterpretSlice<MODE, TO, FROM>::value;
 
 /// A slice represents a contigious array of elements of type T.
 template <typename T>
diff --git a/src/tint/utils/traits.h b/src/tint/utils/traits.h
index 711ea36..f37b073 100644
--- a/src/tint/utils/traits.h
+++ b/src/tint/utils/traits.h
@@ -148,14 +148,14 @@
 /// `[OFFSET..OFFSET+COUNT)`
 template <std::size_t OFFSET, std::size_t COUNT, typename TUPLE>
 constexpr auto Slice(TUPLE&& t) {
-    return detail::Swizzle<TUPLE>(std::forward<TUPLE>(t), Range<OFFSET, COUNT>());
+    return traits::detail::Swizzle<TUPLE>(std::forward<TUPLE>(t), Range<OFFSET, COUNT>());
 }
 
 /// Resolves to the slice of the tuple `t` with the tuple elements
 /// `[OFFSET..OFFSET+COUNT)`
 template <std::size_t OFFSET, std::size_t COUNT, typename TUPLE>
 using SliceTuple =
-    std::remove_pointer_t<decltype(detail::SwizzlePtrTy<TUPLE>(Range<OFFSET, COUNT>()))>;
+    std::remove_pointer_t<decltype(traits::detail::SwizzlePtrTy<TUPLE>(Range<OFFSET, COUNT>()))>;
 
 namespace detail {
 /// Base template for IsTypeIn
@@ -171,7 +171,7 @@
 /// Works for std::variant, std::tuple, std::pair, or any typename template where all parameters are
 /// types.
 template <typename T, typename TypeContainer>
-static constexpr bool IsTypeIn = detail::IsTypeIn<T, TypeContainer>::value;
+static constexpr bool IsTypeIn = traits::detail::IsTypeIn<T, TypeContainer>::value;
 
 /// Evaluates to the decayed pointer element type, or the decayed type T if T is not a pointer.
 template <typename T>
@@ -207,7 +207,7 @@
 /// Evaluates to `char*` or `const char*` if `T` is `char[N]` or `const char[N]`, respectively,
 /// otherwise T.
 template <typename T>
-using CharArrayToCharPtr = typename detail::CharArrayToCharPtrImpl<T>::type;
+using CharArrayToCharPtr = typename traits::detail::CharArrayToCharPtrImpl<T>::type;
 
 }  // namespace tint::utils::traits
 
diff --git a/src/tint/utils/vector.h b/src/tint/utils/vector.h
index 8b8fc0f..78cddbd 100644
--- a/src/tint/utils/vector.h
+++ b/src/tint/utils/vector.h
@@ -571,7 +571,7 @@
 /// Helper for determining the Vector element type (`T`) from the vector's constuctor arguments
 template <typename... Ts>
 using VectorCommonType =
-    typename detail::VectorCommonType<IsCastable<std::remove_pointer_t<Ts>...>, Ts...>::type;
+    typename utils::detail::VectorCommonType<IsCastable<std::remove_pointer_t<Ts>...>, Ts...>::type;
 
 /// Deduction guide for Vector
 template <typename... Ts>
@@ -792,7 +792,7 @@
 
 /// True if T is a Vector<T, N> or VectorRef<T>
 template <typename T>
-static constexpr bool IsVectorLike = detail::IsVectorLike<T>::value;
+static constexpr bool IsVectorLike = utils::detail::IsVectorLike<T>::value;
 
 }  // namespace tint::utils
 
diff --git a/src/tint/writer/append_vector_test.cc b/src/tint/writer/append_vector_test.cc
index ff58ba3..b9e7857 100644
--- a/src/tint/writer/append_vector_test.cc
+++ b/src/tint/writer/append_vector_test.cc
@@ -20,11 +20,12 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::writer {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 class AppendVectorTest : public ::testing::Test, public ProgramBuilder {};
 
 // AppendVector(vec2<i32>(1, 2), 3) -> vec3<i32>(1, 2, 3)
@@ -32,7 +33,7 @@
     auto* scalar_1 = Expr(1_i);
     auto* scalar_2 = Expr(2_i);
     auto* scalar_3 = Expr(3_i);
-    auto* vec_12 = vec2<i32>(scalar_1, scalar_2);
+    auto* vec_12 = Call<vec2<i32>>(scalar_1, scalar_2);
     WrapInFunction(vec_12, scalar_3);
 
     resolver::Resolver resolver(this);
@@ -73,7 +74,7 @@
     auto* scalar_1 = Expr(1_i);
     auto* scalar_2 = Expr(2_i);
     auto* scalar_3 = Expr(3_u);
-    auto* vec_12 = vec2<i32>(scalar_1, scalar_2);
+    auto* vec_12 = Call<vec2<i32>>(scalar_1, scalar_2);
     WrapInFunction(vec_12, scalar_3);
 
     resolver::Resolver resolver(this);
@@ -120,8 +121,8 @@
     auto* scalar_1 = Expr(1_u);
     auto* scalar_2 = Expr(2_u);
     auto* scalar_3 = Expr(3_u);
-    auto* uvec_12 = vec2<u32>(scalar_1, scalar_2);
-    auto* vec_12 = vec2<i32>(uvec_12);
+    auto* uvec_12 = Call<vec2<u32>>(scalar_1, scalar_2);
+    auto* vec_12 = Call<vec2<i32>>(uvec_12);
     WrapInFunction(vec_12, scalar_3);
 
     resolver::Resolver resolver(this);
@@ -170,7 +171,7 @@
     auto* scalar_1 = Expr(1_i);
     auto* scalar_2 = Expr(2_i);
     auto* scalar_3 = Expr(3_f);
-    auto* vec_12 = vec2<i32>(scalar_1, scalar_2);
+    auto* vec_12 = Call<vec2<i32>>(scalar_1, scalar_2);
     WrapInFunction(vec_12, scalar_3);
 
     resolver::Resolver resolver(this);
@@ -216,7 +217,7 @@
     auto* scalar_2 = Expr(2_i);
     auto* scalar_3 = Expr(3_i);
     auto* scalar_4 = Expr(4_i);
-    auto* vec_123 = vec3<i32>(scalar_1, scalar_2, scalar_3);
+    auto* vec_123 = Call<vec3<i32>>(scalar_1, scalar_2, scalar_3);
     WrapInFunction(vec_123, scalar_4);
 
     resolver::Resolver resolver(this);
@@ -298,7 +299,7 @@
     auto* scalar_1 = Expr(1_i);
     auto* scalar_2 = Expr(2_i);
     auto* scalar_3 = Expr("scalar_3");
-    auto* vec_12 = vec2<i32>(scalar_1, scalar_2);
+    auto* vec_12 = Call<vec2<i32>>(scalar_1, scalar_2);
     WrapInFunction(vec_12, scalar_3);
 
     resolver::Resolver resolver(this);
@@ -455,7 +456,7 @@
 // AppendVector(vec3<i32>(), 4) -> vec3<bool>(0, 0, 0, 4)
 TEST_F(AppendVectorTest, ZeroVec3i32_i32) {
     auto* scalar = Expr(4_i);
-    auto* vec000 = vec3<i32>();
+    auto* vec000 = Call<vec3<i32>>();
     WrapInFunction(vec000, scalar);
 
     resolver::Resolver resolver(this);
diff --git a/src/tint/writer/glsl/generator_impl_binary_test.cc b/src/tint/writer/glsl/generator_impl_binary_test.cc
index 9be3fa4..7ca2b09 100644
--- a/src/tint/writer/glsl/generator_impl_binary_test.cc
+++ b/src/tint/writer/glsl/generator_impl_binary_test.cc
@@ -19,11 +19,12 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::writer::glsl {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using GlslGeneratorImplTest_Binary = TestHelper;
 
 struct BinaryData {
@@ -160,7 +161,7 @@
                     BinaryData{"(left % right)", ast::BinaryOp::kModulo}));
 
 TEST_F(GlslGeneratorImplTest_Binary, Multiply_VectorScalar_f32) {
-    GlobalVar("a", vec3<f32>(1_f, 1_f, 1_f), builtin::AddressSpace::kPrivate);
+    GlobalVar("a", Call<vec3<f32>>(1_f, 1_f, 1_f), builtin::AddressSpace::kPrivate);
     auto* lhs = Expr("a");
     auto* rhs = Expr(1_f);
 
@@ -179,7 +180,7 @@
 TEST_F(GlslGeneratorImplTest_Binary, Multiply_VectorScalar_f16) {
     Enable(builtin::Extension::kF16);
 
-    GlobalVar("a", vec3<f16>(1_h, 1_h, 1_h), builtin::AddressSpace::kPrivate);
+    GlobalVar("a", Call<vec3<f16>>(1_h, 1_h, 1_h), builtin::AddressSpace::kPrivate);
     auto* lhs = Expr("a");
     auto* rhs = Expr(1_h);
 
@@ -196,7 +197,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Binary, Multiply_ScalarVector_f32) {
-    GlobalVar("a", vec3<f32>(1_f, 1_f, 1_f), builtin::AddressSpace::kPrivate);
+    GlobalVar("a", Call<vec3<f32>>(1_f, 1_f, 1_f), builtin::AddressSpace::kPrivate);
     auto* lhs = Expr(1_f);
     auto* rhs = Expr("a");
 
@@ -215,7 +216,7 @@
 TEST_F(GlslGeneratorImplTest_Binary, Multiply_ScalarVector_f16) {
     Enable(builtin::Extension::kF16);
 
-    GlobalVar("a", vec3<f16>(1_h, 1_h, 1_h), builtin::AddressSpace::kPrivate);
+    GlobalVar("a", Call<vec3<f16>>(1_h, 1_h, 1_h), builtin::AddressSpace::kPrivate);
     auto* lhs = Expr(1_h);
     auto* rhs = Expr("a");
 
@@ -302,7 +303,7 @@
 TEST_F(GlslGeneratorImplTest_Binary, Multiply_MatrixVector_f32) {
     GlobalVar("mat", ty.mat3x3<f32>(), builtin::AddressSpace::kPrivate);
     auto* lhs = Expr("mat");
-    auto* rhs = vec3<f32>(1_f, 1_f, 1_f);
+    auto* rhs = Call<vec3<f32>>(1_f, 1_f, 1_f);
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
     WrapInFunction(expr);
@@ -320,7 +321,7 @@
 
     GlobalVar("mat", ty.mat3x3<f16>(), builtin::AddressSpace::kPrivate);
     auto* lhs = Expr("mat");
-    auto* rhs = vec3<f16>(1_h, 1_h, 1_h);
+    auto* rhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
     WrapInFunction(expr);
@@ -335,7 +336,7 @@
 
 TEST_F(GlslGeneratorImplTest_Binary, Multiply_VectorMatrix_f32) {
     GlobalVar("mat", ty.mat3x3<f32>(), builtin::AddressSpace::kPrivate);
-    auto* lhs = vec3<f32>(1_f, 1_f, 1_f);
+    auto* lhs = Call<vec3<f32>>(1_f, 1_f, 1_f);
     auto* rhs = Expr("mat");
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
@@ -353,7 +354,7 @@
     Enable(builtin::Extension::kF16);
 
     GlobalVar("mat", ty.mat3x3<f16>(), builtin::AddressSpace::kPrivate);
-    auto* lhs = vec3<f16>(1_h, 1_h, 1_h);
+    auto* lhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
     auto* rhs = Expr("mat");
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
diff --git a/src/tint/writer/glsl/generator_impl_builtin_test.cc b/src/tint/writer/glsl/generator_impl_builtin_test.cc
index e7d1a61..18fa324 100644
--- a/src/tint/writer/glsl/generator_impl_builtin_test.cc
+++ b/src/tint/writer/glsl/generator_impl_builtin_test.cc
@@ -21,7 +21,8 @@
 
 using ::testing::HasSubstr;
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::glsl {
 namespace {
@@ -371,9 +372,9 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Builtin, Select_Vector) {
-    GlobalVar("a", vec2<i32>(1_i, 2_i), builtin::AddressSpace::kPrivate);
-    GlobalVar("b", vec2<i32>(3_i, 4_i), builtin::AddressSpace::kPrivate);
-    auto* call = Call("select", "a", "b", vec2<bool>(true, false));
+    GlobalVar("a", Call<vec2<i32>>(1_i, 2_i), builtin::AddressSpace::kPrivate);
+    GlobalVar("b", Call<vec2<i32>>(3_i, 4_i), builtin::AddressSpace::kPrivate);
+    auto* call = Call("select", "a", "b", Call<vec2<bool>>(true, false));
     WrapInFunction(Decl(Var("r", call)));
     GeneratorImpl& gen = Build();
 
@@ -495,7 +496,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Builtin, Runtime_Modf_Vector_f32) {
-    WrapInFunction(Decl(Let("f", vec3<f32>(1.5_f, 2.5_f, 3.5_f))),  //
+    WrapInFunction(Decl(Let("f", Call<vec3<f32>>(1.5_f, 2.5_f, 3.5_f))),  //
                    Decl(Let("v", Call("modf", "f"))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -532,7 +533,7 @@
 TEST_F(GlslGeneratorImplTest_Builtin, Runtime_Modf_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(Decl(Let("f", vec3<f16>(1.5_h, 2.5_h, 3.5_h))),  //
+    WrapInFunction(Decl(Let("f", Call<vec3<f16>>(1.5_h, 2.5_h, 3.5_h))),  //
                    Decl(Let("v", Call("modf", "f"))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -625,7 +626,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Builtin, Const_Modf_Vector_f32) {
-    WrapInFunction(Decl(Let("v", Call("modf", vec3<f32>(1.5_f, 2.5_f, 3.5_f)))));
+    WrapInFunction(Decl(Let("v", Call("modf", Call<vec3<f32>>(1.5_f, 2.5_f, 3.5_f)))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
 
@@ -654,7 +655,7 @@
 TEST_F(GlslGeneratorImplTest_Builtin, Const_Modf_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(Decl(Let("v", Call("modf", vec3<f16>(1.5_h, 2.5_h, 3.5_h)))));
+    WrapInFunction(Decl(Let("v", Call("modf", Call<vec3<f16>>(1.5_h, 2.5_h, 3.5_h)))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
 
@@ -755,7 +756,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Builtin, Runtime_Frexp_Vector_f32) {
-    WrapInFunction(Var("f", Expr(vec3<f32>())),  //
+    WrapInFunction(Var("f", Call<vec3<f32>>()),  //
                    Var("v", Call("frexp", "f")));
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -792,7 +793,7 @@
 TEST_F(GlslGeneratorImplTest_Builtin, Runtime_Frexp_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(Var("f", Expr(vec3<f16>())),  //
+    WrapInFunction(Var("f", Call<vec3<f16>>()),  //
                    Var("v", Call("frexp", "f")));
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -885,7 +886,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Builtin, Const_Frexp_Vector_f32) {
-    WrapInFunction(Decl(Let("v", Call("frexp", vec3<f32>()))));
+    WrapInFunction(Decl(Let("v", Call("frexp", Call<vec3<f32>>()))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
 
@@ -914,7 +915,7 @@
 TEST_F(GlslGeneratorImplTest_Builtin, Const_Frexp_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(Decl(Let("v", Call("frexp", vec3<f16>()))));
+    WrapInFunction(Decl(Let("v", Call("frexp", Call<vec3<f16>>()))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
 
@@ -1576,7 +1577,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Builtin, QuantizeToF16_Vec2) {
-    GlobalVar("v", vec2<f32>(2_f), builtin::AddressSpace::kPrivate);
+    GlobalVar("v", Call<vec2<f32>>(2_f), builtin::AddressSpace::kPrivate);
     WrapInFunction(Call("quantizeToF16", "v"));
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -1604,7 +1605,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Builtin, QuantizeToF16_Vec3) {
-    GlobalVar("v", vec3<f32>(2_f), builtin::AddressSpace::kPrivate);
+    GlobalVar("v", Call<vec3<f32>>(2_f), builtin::AddressSpace::kPrivate);
     WrapInFunction(Call("quantizeToF16", "v"));
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -1634,7 +1635,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Builtin, QuantizeToF16_Vec4) {
-    GlobalVar("v", vec4<f32>(2_f), builtin::AddressSpace::kPrivate);
+    GlobalVar("v", Call<vec4<f32>>(2_f), builtin::AddressSpace::kPrivate);
     WrapInFunction(Call("quantizeToF16", "v"));
 
     GeneratorImpl& gen = SanitizeAndBuild();
diff --git a/src/tint/writer/glsl/generator_impl_cast_test.cc b/src/tint/writer/glsl/generator_impl_cast_test.cc
index 4773a4b..b39bc2e 100644
--- a/src/tint/writer/glsl/generator_impl_cast_test.cc
+++ b/src/tint/writer/glsl/generator_impl_cast_test.cc
@@ -17,7 +17,8 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::glsl {
 namespace {
@@ -37,7 +38,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Cast, EmitExpression_Cast_Vector) {
-    auto* cast = vec3<f32>(vec3<i32>(1_i, 2_i, 3_i));
+    auto* cast = Call<vec3<f32>>(Call<vec3<i32>>(1_i, 2_i, 3_i));
     WrapInFunction(cast);
 
     GeneratorImpl& gen = Build();
diff --git a/src/tint/writer/glsl/generator_impl_constructor_test.cc b/src/tint/writer/glsl/generator_impl_constructor_test.cc
index 2983382..d0fc0bc 100644
--- a/src/tint/writer/glsl/generator_impl_constructor_test.cc
+++ b/src/tint/writer/glsl/generator_impl_constructor_test.cc
@@ -15,7 +15,8 @@
 #include "gmock/gmock.h"
 #include "src/tint/writer/glsl/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::glsl {
 namespace {
@@ -121,7 +122,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Vec_F32) {
-    WrapInFunction(vec3<f32>(1_f, 2_f, 3_f));
+    WrapInFunction(Call<vec3<f32>>(1_f, 2_f, 3_f));
 
     GeneratorImpl& gen = Build();
     gen.Generate();
@@ -132,7 +133,7 @@
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Vec_F16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(vec3<f16>(1_h, 2_h, 3_h));
+    WrapInFunction(Call<vec3<f16>>(1_h, 2_h, 3_h));
 
     GeneratorImpl& gen = Build();
     gen.Generate();
@@ -141,7 +142,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Vec_Empty_F32) {
-    WrapInFunction(vec3<f32>());
+    WrapInFunction(Call<vec3<f32>>());
 
     GeneratorImpl& gen = Build();
     gen.Generate();
@@ -152,7 +153,7 @@
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Vec_Empty_F16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(vec3<f16>());
+    WrapInFunction(Call<vec3<f16>>());
 
     GeneratorImpl& gen = Build();
     gen.Generate();
@@ -161,7 +162,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_F32_Literal) {
-    WrapInFunction(vec3<f32>(2_f));
+    WrapInFunction(Call<vec3<f32>>(2_f));
 
     GeneratorImpl& gen = Build();
     gen.Generate();
@@ -172,7 +173,7 @@
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_F16_Literal) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(vec3<f16>(2_h));
+    WrapInFunction(Call<vec3<f16>>(2_h));
 
     GeneratorImpl& gen = Build();
     gen.Generate();
@@ -182,7 +183,7 @@
 
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_F32_Var) {
     auto* var = Var("v", Expr(2_f));
-    auto* cast = vec3<f32>(var);
+    auto* cast = Call<vec3<f32>>(var);
     WrapInFunction(var, cast);
 
     GeneratorImpl& gen = Build();
@@ -196,7 +197,7 @@
     Enable(builtin::Extension::kF16);
 
     auto* var = Var("v", Expr(2_h));
-    auto* cast = vec3<f16>(var);
+    auto* cast = Call<vec3<f16>>(var);
     WrapInFunction(var, cast);
 
     GeneratorImpl& gen = Build();
@@ -207,7 +208,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_Bool) {
-    WrapInFunction(vec3<bool>(true));
+    WrapInFunction(Call<vec3<bool>>(true));
 
     GeneratorImpl& gen = Build();
     gen.Generate();
@@ -216,7 +217,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_Int) {
-    WrapInFunction(vec3<i32>(2_i));
+    WrapInFunction(Call<vec3<i32>>(2_i));
 
     GeneratorImpl& gen = Build();
     gen.Generate();
@@ -225,7 +226,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_UInt) {
-    WrapInFunction(vec3<u32>(2_u));
+    WrapInFunction(Call<vec3<u32>>(2_u));
 
     GeneratorImpl& gen = Build();
     gen.Generate();
@@ -234,7 +235,8 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Mat_F32) {
-    WrapInFunction(mat2x3<f32>(vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(3_f, 4_f, 5_f)));
+    WrapInFunction(
+        Call<mat2x3<f32>>(Call<vec3<f32>>(1_f, 2_f, 3_f), Call<vec3<f32>>(3_f, 4_f, 5_f)));
 
     GeneratorImpl& gen = Build();
     gen.Generate();
@@ -245,7 +247,8 @@
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Mat_F16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(mat2x3<f16>(vec3<f16>(1_h, 2_h, 3_h), vec3<f16>(3_h, 4_h, 5_h)));
+    WrapInFunction(
+        Call<mat2x3<f16>>(Call<vec3<f16>>(1_h, 2_h, 3_h), Call<vec3<f16>>(3_h, 4_h, 5_h)));
 
     GeneratorImpl& gen = Build();
     gen.Generate();
@@ -262,14 +265,14 @@
     //     vec4<f32>(vec4<f32>(42.0f, 21.0f, 6.0f, -5.0f)),
     //   );
     auto* vector_literal =
-        vec4<f32>(Expr(f32(2.0)), Expr(f32(3.0)), Expr(f32(4.0)), Expr(f32(8.0)));
-    auto* vector_zero_init = vec4<f32>();
-    auto* vector_single_scalar_init = vec4<f32>(Expr(f32(7.0)));
-    auto* vector_identical_init =
-        vec4<f32>(vec4<f32>(Expr(f32(42.0)), Expr(f32(21.0)), Expr(f32(6.0)), Expr(f32(-5.0))));
+        Call<vec4<f32>>(Expr(f32(2.0)), Expr(f32(3.0)), Expr(f32(4.0)), Expr(f32(8.0)));
+    auto* vector_zero_init = Call<vec4<f32>>();
+    auto* vector_single_scalar_init = Call<vec4<f32>>(Expr(f32(7.0)));
+    auto* vector_identical_init = Call<vec4<f32>>(
+        Call<vec4<f32>>(Expr(f32(42.0)), Expr(f32(21.0)), Expr(f32(6.0)), Expr(f32(-5.0))));
 
-    auto* ctor = mat4x4<f32>(vector_literal, vector_zero_init, vector_single_scalar_init,
-                             vector_identical_init);
+    auto* ctor = Call<mat4x4<f32>>(vector_literal, vector_zero_init, vector_single_scalar_init,
+                                   vector_identical_init);
 
     WrapInFunction(ctor);
 
@@ -290,14 +293,14 @@
     Enable(builtin::Extension::kF16);
 
     auto* vector_literal =
-        vec4<f16>(Expr(f16(2.0)), Expr(f16(3.0)), Expr(f16(4.0)), Expr(f16(8.0)));
-    auto* vector_zero_init = vec4<f16>();
-    auto* vector_single_scalar_init = vec4<f16>(Expr(f16(7.0)));
-    auto* vector_identical_init =
-        vec4<f16>(vec4<f16>(Expr(f16(42.0)), Expr(f16(21.0)), Expr(f16(6.0)), Expr(f16(-5.0))));
+        Call<vec4<f16>>(Expr(f16(2.0)), Expr(f16(3.0)), Expr(f16(4.0)), Expr(f16(8.0)));
+    auto* vector_zero_init = Call<vec4<f16>>();
+    auto* vector_single_scalar_init = Call<vec4<f16>>(Expr(f16(7.0)));
+    auto* vector_identical_init = Call<vec4<f16>>(
+        Call<vec4<f16>>(Expr(f16(42.0)), Expr(f16(21.0)), Expr(f16(6.0)), Expr(f16(-5.0))));
 
-    auto* ctor = mat4x4<f16>(vector_literal, vector_zero_init, vector_single_scalar_init,
-                             vector_identical_init);
+    auto* ctor = Call<mat4x4<f16>>(vector_literal, vector_zero_init, vector_single_scalar_init,
+                                   vector_identical_init);
 
     WrapInFunction(ctor);
 
@@ -310,7 +313,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Mat_Empty_F32) {
-    WrapInFunction(mat2x3<f32>());
+    WrapInFunction(Call<mat2x3<f32>>());
 
     GeneratorImpl& gen = Build();
     gen.Generate();
@@ -321,7 +324,7 @@
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Mat_Empty_F16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(mat2x3<f16>());
+    WrapInFunction(Call<mat2x3<f16>>());
 
     GeneratorImpl& gen = Build();
     gen.Generate();
@@ -336,8 +339,8 @@
     //     var m_2: mat4x4<f32> = mat4x4<f32>(m_1);
     // }
 
-    auto* m_1 = Var("m_1", ty.mat4x4(ty.f32()), mat4x4<f32>());
-    auto* m_2 = Var("m_2", ty.mat4x4(ty.f32()), mat4x4<f32>(m_1));
+    auto* m_1 = Var("m_1", ty.mat4x4(ty.f32()), Call<mat4x4<f32>>());
+    auto* m_2 = Var("m_2", ty.mat4x4(ty.f32()), Call<mat4x4<f32>>(m_1));
 
     WrapInFunction(m_1, m_2);
 
@@ -355,8 +358,8 @@
 
     Enable(builtin::Extension::kF16);
 
-    auto* m_1 = Var("m_1", ty.mat4x4(ty.f16()), mat4x4<f16>());
-    auto* m_2 = Var("m_2", ty.mat4x4(ty.f16()), mat4x4<f16>(m_1));
+    auto* m_1 = Var("m_1", ty.mat4x4(ty.f16()), Call<mat4x4<f16>>());
+    auto* m_2 = Var("m_2", ty.mat4x4(ty.f16()), Call<mat4x4<f16>>(m_1));
 
     WrapInFunction(m_1, m_2);
 
@@ -367,8 +370,9 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Array) {
-    WrapInFunction(Call(ty.array(ty.vec3<f32>(), 3_u), vec3<f32>(1_f, 2_f, 3_f),
-                        vec3<f32>(4_f, 5_f, 6_f), vec3<f32>(7_f, 8_f, 9_f)));
+    WrapInFunction(Call<array<vec3<f32>, 3>>(Call<vec3<f32>>(1_f, 2_f, 3_f),
+                                             Call<vec3<f32>>(4_f, 5_f, 6_f),
+                                             Call<vec3<f32>>(7_f, 8_f, 9_f)));
 
     GeneratorImpl& gen = Build();
     gen.Generate();
@@ -379,7 +383,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Constructor, Type_Array_Empty) {
-    WrapInFunction(Call(ty.array(ty.vec3<f32>(), 3_u)));
+    WrapInFunction(Call<array<vec3<f32>, 3>>());
 
     GeneratorImpl& gen = Build();
     gen.Generate();
@@ -394,7 +398,7 @@
                                    Member("c", ty.vec3<i32>()),
                                });
 
-    WrapInFunction(Call(ty.Of(str), 1_i, 2_f, vec3<i32>(3_i, 4_i, 5_i)));
+    WrapInFunction(Call(ty.Of(str), 1_i, 2_f, Call<vec3<i32>>(3_i, 4_i, 5_i)));
 
     GeneratorImpl& gen = SanitizeAndBuild();
     gen.Generate();
diff --git a/src/tint/writer/glsl/generator_impl_function_test.cc b/src/tint/writer/glsl/generator_impl_function_test.cc
index 34375f7..43f8773 100644
--- a/src/tint/writer/glsl/generator_impl_function_test.cc
+++ b/src/tint/writer/glsl/generator_impl_function_test.cc
@@ -20,11 +20,12 @@
 
 using ::testing::HasSubstr;
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::writer::glsl {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using GlslGeneratorImplTest_Function = TestHelper;
 
 TEST_F(GlslGeneratorImplTest_Function, Emit_Function) {
@@ -110,7 +111,7 @@
     // fn f(foo : ptr<function, f32>) -> f32 {
     //   return *foo;
     // }
-    Func("f", utils::Vector{Param("foo", ty.ptr<f32>(builtin::AddressSpace::kFunction))}, ty.f32(),
+    Func("f", utils::Vector{Param("foo", ty.ptr<function, f32>())}, ty.f32(),
          utils::Vector{Return(Deref("foo"))});
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -207,7 +208,7 @@
     //   @location(2) col2 : f32;
     // };
     // fn vert_main() -> Interface {
-    //   return Interface(vec4<f32>(), 0.4, 0.6);
+    //   return Interface(vec4<f32>(), 0.5, 0.25);
     // }
     // fn frag_main(inputs : Interface) {
     //   const r = inputs.col1;
@@ -223,8 +224,7 @@
         });
 
     Func("vert_main", utils::Empty, ty.Of(interface_struct),
-         utils::Vector{Return(
-             Call(ty.Of(interface_struct), Call(ty.vec4<f32>()), Expr(0.5_f), Expr(0.25_f)))},
+         utils::Vector{Return(Call(ty.Of(interface_struct), Call<vec4<f32>>(), 0.5_f, 0.25_f))},
          utils::Vector{Stage(ast::PipelineStage::kVertex)});
 
     Func("frag_main", utils::Vector{Param("inputs", ty.Of(interface_struct))}, ty.void_(),
@@ -301,7 +301,7 @@
 
   Func("foo", utils::Vector{Param("x", ty.f32())}, ty.Of(vertex_output_struct),
        {Return(Call(ty.Of(vertex_output_struct),
-                         Call(ty.vec4<f32>(), "x", "x", "x", Expr(1_f))))},
+                         Call<vec4<f32>>( "x", "x", "x", 1_f)))},
        {});
 
   Func("vert_main1", utils::Empty, ty.Of(vertex_output_struct),
@@ -845,7 +845,7 @@
 TEST_F(GlslGeneratorImplTest_Function, Emit_Function_WithArrayReturn) {
     Func("my_func", utils::Empty, ty.array<f32, 5>(),
          utils::Vector{
-             Return(Call(ty.array<f32, 5>())),
+             Return(Call<array<f32, 5>>()),
          });
 
     GeneratorImpl& gen = Build();
diff --git a/src/tint/writer/glsl/generator_impl_import_test.cc b/src/tint/writer/glsl/generator_impl_import_test.cc
index 6f772ea..0f27e4b 100644
--- a/src/tint/writer/glsl/generator_impl_import_test.cc
+++ b/src/tint/writer/glsl/generator_impl_import_test.cc
@@ -17,11 +17,12 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::writer::glsl {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using GlslGeneratorImplTest_Import = TestHelper;
 
 struct GlslImportData {
@@ -95,7 +96,7 @@
 TEST_P(GlslImportData_SingleVectorParamTest, FloatVector) {
     auto param = GetParam();
 
-    auto* expr = Call(param.name, vec3<f32>(0.1_f, 0.2_f, 0.3_f));
+    auto* expr = Call(param.name, Call<vec3<f32>>(0.1_f, 0.2_f, 0.3_f));
     WrapInFunction(expr);
 
     GeneratorImpl& gen = Build();
@@ -162,7 +163,7 @@
 TEST_P(GlslImportData_DualParam_VectorTest, Float) {
     auto param = GetParam();
 
-    auto* expr = Call(param.name, vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(4_f, 5_f, 6_f));
+    auto* expr = Call(param.name, Call<vec3<f32>>(1_f, 2_f, 3_f), Call<vec3<f32>>(4_f, 5_f, 6_f));
     WrapInFunction(expr);
 
     GeneratorImpl& gen = Build();
@@ -227,8 +228,8 @@
 TEST_P(GlslImportData_TripleParam_VectorTest, Float) {
     auto param = GetParam();
 
-    auto* expr = Call(param.name, vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(4_f, 5_f, 6_f),
-                      vec3<f32>(7_f, 8_f, 9_f));
+    auto* expr = Call(param.name, Call<vec3<f32>>(1_f, 2_f, 3_f), Call<vec3<f32>>(4_f, 5_f, 6_f),
+                      Call<vec3<f32>>(7_f, 8_f, 9_f));
     WrapInFunction(expr);
 
     GeneratorImpl& gen = Build();
diff --git a/src/tint/writer/glsl/generator_impl_member_accessor_test.cc b/src/tint/writer/glsl/generator_impl_member_accessor_test.cc
index 041e72c..7f252b1 100644
--- a/src/tint/writer/glsl/generator_impl_member_accessor_test.cc
+++ b/src/tint/writer/glsl/generator_impl_member_accessor_test.cc
@@ -17,12 +17,12 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::writer::glsl {
 namespace {
 
 using ::testing::HasSubstr;
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 using create_type_func_ptr = ast::Type (*)(const ProgramBuilder::TypesBuilder& ty);
 
@@ -275,7 +275,7 @@
     });
 
     SetupFunction(utils::Vector{
-        Assign(MemberAccessor("data", "b"), Call(ty.mat2x3<f32>())),
+        Assign(MemberAccessor("data", "b"), Call<mat2x3<f32>>()),
     });
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -769,7 +769,7 @@
 
     SetupFunction(utils::Vector{
         Assign(MemberAccessor(IndexAccessor(MemberAccessor("data", "c"), 2_i), "b"),
-               vec3<f32>(1_f, 2_f, 3_f)),
+               Call<vec3<f32>>(1_f, 2_f, 3_f)),
     });
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -868,7 +868,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_MemberAccessor, Swizzle_xyz) {
-    auto* var = Var("my_vec", ty.vec4<f32>(), vec4<f32>(1_f, 2_f, 3_f, 4_f));
+    auto* var = Var("my_vec", ty.vec4<f32>(), Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f));
     auto* expr = MemberAccessor("my_vec", "xyz");
     WrapInFunction(var, expr);
 
@@ -879,7 +879,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_MemberAccessor, Swizzle_gbr) {
-    auto* var = Var("my_vec", ty.vec4<f32>(), vec4<f32>(1_f, 2_f, 3_f, 4_f));
+    auto* var = Var("my_vec", ty.vec4<f32>(), Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f));
     auto* expr = MemberAccessor("my_vec", "gbr");
     WrapInFunction(var, expr);
 
diff --git a/src/tint/writer/glsl/generator_impl_module_constant_test.cc b/src/tint/writer/glsl/generator_impl_module_constant_test.cc
index 8de0dd0..9a80721 100644
--- a/src/tint/writer/glsl/generator_impl_module_constant_test.cc
+++ b/src/tint/writer/glsl/generator_impl_module_constant_test.cc
@@ -17,15 +17,16 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::writer::glsl {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using GlslGeneratorImplTest_ModuleConstant = TestHelper;
 
 TEST_F(GlslGeneratorImplTest_ModuleConstant, Emit_GlobalLet) {
-    auto* var = Let("pos", ty.array<f32, 3>(), array<f32, 3>(1_f, 2_f, 3_f));
+    auto* var = Let("pos", ty.array<f32, 3>(), Call<array<f32, 3>>(1_f, 2_f, 3_f));
     WrapInFunction(Decl(var));
 
     GeneratorImpl& gen = Build();
@@ -152,7 +153,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_vec3_AInt) {
-    auto* var = GlobalConst("G", Call(ty.vec3<Infer>(), 1_a, 2_a, 3_a));
+    auto* var = GlobalConst("G", Call<vec3<Infer>>(1_a, 2_a, 3_a));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(Let("l", Expr(var))),
@@ -171,7 +172,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_vec3_AFloat) {
-    auto* var = GlobalConst("G", Call(ty.vec3<Infer>(), 1._a, 2._a, 3._a));
+    auto* var = GlobalConst("G", Call<vec3<Infer>>(1._a, 2._a, 3._a));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(Let("l", Expr(var))),
@@ -190,7 +191,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_vec3_f32) {
-    auto* var = GlobalConst("G", vec3<f32>(1_f, 2_f, 3_f));
+    auto* var = GlobalConst("G", Call<vec3<f32>>(1_f, 2_f, 3_f));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(Let("l", Expr(var))),
@@ -211,7 +212,7 @@
 TEST_F(GlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_vec3_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = GlobalConst("G", vec3<f16>(1_h, 2_h, 3_h));
+    auto* var = GlobalConst("G", Call<vec3<f16>>(1_h, 2_h, 3_h));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(Let("l", Expr(var))),
@@ -231,7 +232,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_mat2x3_AFloat) {
-    auto* var = GlobalConst("G", Call(ty.mat2x3<Infer>(), 1._a, 2._a, 3._a, 4._a, 5._a, 6._a));
+    auto* var = GlobalConst("G", Call<mat2x3<Infer>>(1._a, 2._a, 3._a, 4._a, 5._a, 6._a));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(Let("l", Expr(var))),
@@ -250,7 +251,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_mat2x3_f32) {
-    auto* var = GlobalConst("G", mat2x3<f32>(1_f, 2_f, 3_f, 4_f, 5_f, 6_f));
+    auto* var = GlobalConst("G", Call<mat2x3<f32>>(1_f, 2_f, 3_f, 4_f, 5_f, 6_f));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(Let("l", Expr(var))),
@@ -271,7 +272,7 @@
 TEST_F(GlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_mat2x3_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = GlobalConst("G", mat2x3<f16>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
+    auto* var = GlobalConst("G", Call<mat2x3<f16>>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(Let("l", Expr(var))),
@@ -291,7 +292,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_arr_f32) {
-    auto* var = GlobalConst("G", Call(ty.array<f32, 3>(), 1_f, 2_f, 3_f));
+    auto* var = GlobalConst("G", Call<array<f32, 3>>(1_f, 2_f, 3_f));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(Let("l", Expr(var))),
@@ -310,10 +311,10 @@
 }
 
 TEST_F(GlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_arr_vec2_bool) {
-    auto* var = GlobalConst("G", Call(ty.array(ty.vec2<bool>(), 3_u),  //
-                                      vec2<bool>(true, false),         //
-                                      vec2<bool>(false, true),         //
-                                      vec2<bool>(true, true)));
+    auto* var = GlobalConst("G", Call<array<vec2<bool>, 3>>(         //
+                                     Call<vec2<bool>>(true, false),  //
+                                     Call<vec2<bool>>(false, true),  //
+                                     Call<vec2<bool>>(true, true)));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(Let("l", Expr(var))),
diff --git a/src/tint/writer/glsl/generator_impl_sanitizer_test.cc b/src/tint/writer/glsl/generator_impl_sanitizer_test.cc
index fdd216f..ca60d36 100644
--- a/src/tint/writer/glsl/generator_impl_sanitizer_test.cc
+++ b/src/tint/writer/glsl/generator_impl_sanitizer_test.cc
@@ -19,11 +19,12 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::writer::glsl {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using GlslSanitizerTest = TestHelper;
 
 TEST_F(GlslSanitizerTest, Call_ArrayLength) {
@@ -149,7 +150,7 @@
 }
 
 TEST_F(GlslSanitizerTest, PromoteArrayInitializerToConstVar) {
-    auto* array_init = array<i32, 4>(1_i, 2_i, 3_i, 4_i);
+    auto* array_init = Call<array<i32, 4>>(1_i, 2_i, 3_i, 4_i);
 
     Func("main", utils::Empty, ty.void_(),
          utils::Vector{
@@ -189,7 +190,7 @@
                                    Member("c", ty.i32()),
                                });
     auto* runtime_value = Var("runtime_value", Expr(3_f));
-    auto* struct_init = Call(ty.Of(str), 1_i, vec3<f32>(2_f, runtime_value, 4_f), 4_i);
+    auto* struct_init = Call(ty.Of(str), 1_i, Call<vec3<f32>>(2_f, runtime_value, 4_f), 4_i);
     auto* struct_access = MemberAccessor(struct_init, "b");
     auto* pos = Var("pos", ty.vec3<f32>(), struct_access);
 
@@ -235,7 +236,7 @@
     // let p : ptr<function, i32> = &v;
     // let x : i32 = *p;
     auto* v = Var("v", ty.i32());
-    auto* p = Let("p", ty.ptr<i32>(builtin::AddressSpace::kFunction), AddressOf(v));
+    auto* p = Let("p", ty.ptr<function, i32>(), AddressOf(v));
     auto* x = Var("x", ty.i32(), Deref(p));
 
     Func("main", utils::Empty, ty.void_(),
@@ -276,12 +277,9 @@
     // let vp : ptr<function, vec4<f32>> = &(*mp)[2i];
     // let v : vec4<f32> = *vp;
     auto* a = Var("a", ty.array(ty.mat4x4<f32>(), 4_u));
-    auto* ap = Let("ap", ty.ptr(builtin::AddressSpace::kFunction, ty.array(ty.mat4x4<f32>(), 4_u)),
-                   AddressOf(a));
-    auto* mp = Let("mp", ty.ptr(builtin::AddressSpace::kFunction, ty.mat4x4<f32>()),
-                   AddressOf(IndexAccessor(Deref(ap), 3_i)));
-    auto* vp = Let("vp", ty.ptr(builtin::AddressSpace::kFunction, ty.vec4<f32>()),
-                   AddressOf(IndexAccessor(Deref(mp), 2_i)));
+    auto* ap = Let("ap", ty.ptr<function, array<mat4x4<f32>, 4>>(), AddressOf(a));
+    auto* mp = Let("mp", ty.ptr<function, mat4x4<f32>>(), AddressOf(IndexAccessor(Deref(ap), 3_i)));
+    auto* vp = Let("vp", ty.ptr<function, vec4<f32>>(), AddressOf(IndexAccessor(Deref(mp), 2_i)));
     auto* v = Var("v", ty.vec4<f32>(), Deref(vp));
 
     Func("main", utils::Empty, ty.void_(),
diff --git a/src/tint/writer/glsl/generator_impl_storage_buffer_test.cc b/src/tint/writer/glsl/generator_impl_storage_buffer_test.cc
index 821b0e9..8ebe654 100644
--- a/src/tint/writer/glsl/generator_impl_storage_buffer_test.cc
+++ b/src/tint/writer/glsl/generator_impl_storage_buffer_test.cc
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "src/tint/number.h"
+#include "src/tint/builtin/number.h"
 #include "src/tint/writer/glsl/test_helper.h"
 
 #include "gmock/gmock.h"
diff --git a/src/tint/writer/glsl/generator_impl_variable_decl_statement_test.cc b/src/tint/writer/glsl/generator_impl_variable_decl_statement_test.cc
index 80a1fa0..d4171c5 100644
--- a/src/tint/writer/glsl/generator_impl_variable_decl_statement_test.cc
+++ b/src/tint/writer/glsl/generator_impl_variable_decl_statement_test.cc
@@ -17,12 +17,12 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::writer::glsl {
 namespace {
 
 using ::testing::HasSubstr;
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 using GlslGeneratorImplTest_VariableDecl = TestHelper;
 
@@ -186,7 +186,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_vec3_AInt) {
-    auto* C = Const("C", Call(ty.vec3<Infer>(), 1_a, 2_a, 3_a));
+    auto* C = Const("C", Call<vec3<Infer>>(1_a, 2_a, 3_a));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -206,7 +206,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_vec3_AFloat) {
-    auto* C = Const("C", Call(ty.vec3<Infer>(), 1._a, 2._a, 3._a));
+    auto* C = Const("C", Call<vec3<Infer>>(1._a, 2._a, 3._a));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -226,7 +226,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_vec3_f32) {
-    auto* C = Const("C", vec3<f32>(1_f, 2_f, 3_f));
+    auto* C = Const("C", Call<vec3<f32>>(1_f, 2_f, 3_f));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -248,7 +248,7 @@
 TEST_F(GlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_vec3_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* C = Const("C", vec3<f16>(1_h, 2_h, 3_h));
+    auto* C = Const("C", Call<vec3<f16>>(1_h, 2_h, 3_h));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -269,7 +269,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_mat2x3_AFloat) {
-    auto* C = Const("C", Call(ty.mat2x3<Infer>(), 1._a, 2._a, 3._a, 4._a, 5._a, 6._a));
+    auto* C = Const("C", Call<mat2x3<Infer>>(1._a, 2._a, 3._a, 4._a, 5._a, 6._a));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -289,7 +289,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_mat2x3_f32) {
-    auto* C = Const("C", mat2x3<f32>(1_f, 2_f, 3_f, 4_f, 5_f, 6_f));
+    auto* C = Const("C", Call<mat2x3<f32>>(1_f, 2_f, 3_f, 4_f, 5_f, 6_f));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -311,7 +311,7 @@
 TEST_F(GlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_mat2x3_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* C = Const("C", mat2x3<f16>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
+    auto* C = Const("C", Call<mat2x3<f16>>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -332,7 +332,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_arr_f32) {
-    auto* C = Const("C", Call(ty.array<f32, 3>(), 1_f, 2_f, 3_f));
+    auto* C = Const("C", Call<array<f32, 3>>(1_f, 2_f, 3_f));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -352,7 +352,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_arr_f32_zero) {
-    auto* C = Const("C", Call(ty.array<f32, 2>()));
+    auto* C = Const("C", Call<array<f32, 2>>());
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -372,7 +372,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_arr_arr_f32_zero) {
-    auto* C = Const("C", Call(ty.array(ty.array<f32, 2>(), 3_i)));
+    auto* C = Const("C", Call<array<array<f32, 2>, 3>>());
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -418,10 +418,10 @@
 }
 
 TEST_F(GlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_arr_vec2_bool) {
-    auto* C = Const("C", Call(ty.array(ty.vec2<bool>(), 3_u),  //
-                              vec2<bool>(true, false),         //
-                              vec2<bool>(false, true),         //
-                              vec2<bool>(true, true)));
+    auto* C = Const("C", Call<array<vec2<bool>, 3>>(         //
+                             Call<vec2<bool>>(true, false),  //
+                             Call<vec2<bool>>(false, true),  //
+                             Call<vec2<bool>>(true, true)));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -466,7 +466,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Initializer_ZeroVec_f32) {
-    auto* var = Var("a", ty.vec3<f32>(), vec3<f32>());
+    auto* var = Var("a", ty.vec3<f32>(), Call<vec3<f32>>());
 
     auto* stmt = Decl(var);
     WrapInFunction(stmt);
@@ -481,7 +481,7 @@
 TEST_F(GlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Initializer_ZeroVec_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Var("a", ty.vec3<f16>(), vec3<f16>());
+    auto* var = Var("a", ty.vec3<f16>(), Call<vec3<f16>>());
 
     auto* stmt = Decl(var);
     WrapInFunction(stmt);
@@ -494,7 +494,7 @@
 }
 
 TEST_F(GlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Initializer_ZeroMat_f32) {
-    auto* var = Var("a", ty.mat2x3<f32>(), mat2x3<f32>());
+    auto* var = Var("a", ty.mat2x3<f32>(), Call<mat2x3<f32>>());
 
     auto* stmt = Decl(var);
     WrapInFunction(stmt);
@@ -510,7 +510,7 @@
 TEST_F(GlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Initializer_ZeroMat_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Var("a", ty.mat2x3<f16>(), mat2x3<f16>());
+    auto* var = Var("a", ty.mat2x3<f16>(), Call<mat2x3<f16>>());
 
     auto* stmt = Decl(var);
     WrapInFunction(stmt);
diff --git a/src/tint/writer/hlsl/generator_impl_binary_test.cc b/src/tint/writer/hlsl/generator_impl_binary_test.cc
index 61a4ee1..f851976 100644
--- a/src/tint/writer/hlsl/generator_impl_binary_test.cc
+++ b/src/tint/writer/hlsl/generator_impl_binary_test.cc
@@ -17,7 +17,8 @@
 #include "src/tint/utils/string_stream.h"
 #include "src/tint/writer/hlsl/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::hlsl {
 namespace {
@@ -176,7 +177,7 @@
                                BinaryData::Types::Float}));
 
 TEST_F(HlslGeneratorImplTest_Binary, Multiply_VectorScalar_f32) {
-    auto* lhs = vec3<f32>(1_f, 1_f, 1_f);
+    auto* lhs = Call<vec3<f32>>(1_f, 1_f, 1_f);
     auto* rhs = Expr(1_f);
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
@@ -193,7 +194,7 @@
 TEST_F(HlslGeneratorImplTest_Binary, Multiply_VectorScalar_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* lhs = vec3<f16>(1_h, 1_h, 1_h);
+    auto* lhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
     auto* rhs = Expr(1_h);
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
@@ -209,7 +210,7 @@
 
 TEST_F(HlslGeneratorImplTest_Binary, Multiply_ScalarVector_f32) {
     auto* lhs = Expr(1_f);
-    auto* rhs = vec3<f32>(1_f, 1_f, 1_f);
+    auto* rhs = Call<vec3<f32>>(1_f, 1_f, 1_f);
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
 
@@ -226,7 +227,7 @@
     Enable(builtin::Extension::kF16);
 
     auto* lhs = Expr(1_h);
-    auto* rhs = vec3<f16>(1_h, 1_h, 1_h);
+    auto* rhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
 
@@ -306,7 +307,7 @@
 TEST_F(HlslGeneratorImplTest_Binary, Multiply_MatrixVector_f32) {
     GlobalVar("mat", ty.mat3x3<f32>(), builtin::AddressSpace::kPrivate);
     auto* lhs = Expr("mat");
-    auto* rhs = vec3<f32>(1_f, 1_f, 1_f);
+    auto* rhs = Call<vec3<f32>>(1_f, 1_f, 1_f);
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
     WrapInFunction(expr);
@@ -323,7 +324,7 @@
 
     GlobalVar("mat", ty.mat3x3<f16>(), builtin::AddressSpace::kPrivate);
     auto* lhs = Expr("mat");
-    auto* rhs = vec3<f16>(1_h, 1_h, 1_h);
+    auto* rhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
     WrapInFunction(expr);
@@ -337,7 +338,7 @@
 
 TEST_F(HlslGeneratorImplTest_Binary, Multiply_VectorMatrix_f32) {
     GlobalVar("mat", ty.mat3x3<f32>(), builtin::AddressSpace::kPrivate);
-    auto* lhs = vec3<f32>(1_f, 1_f, 1_f);
+    auto* lhs = Call<vec3<f32>>(1_f, 1_f, 1_f);
     auto* rhs = Expr("mat");
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
@@ -354,7 +355,7 @@
     Enable(builtin::Extension::kF16);
 
     GlobalVar("mat", ty.mat3x3<f16>(), builtin::AddressSpace::kPrivate);
-    auto* lhs = vec3<f16>(1_h, 1_h, 1_h);
+    auto* lhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
     auto* rhs = Expr("mat");
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
diff --git a/src/tint/writer/hlsl/generator_impl_builtin_test.cc b/src/tint/writer/hlsl/generator_impl_builtin_test.cc
index 92406a6..415917a 100644
--- a/src/tint/writer/hlsl/generator_impl_builtin_test.cc
+++ b/src/tint/writer/hlsl/generator_impl_builtin_test.cc
@@ -21,7 +21,8 @@
 
 using ::testing::HasSubstr;
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::hlsl {
 namespace {
@@ -368,9 +369,9 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Builtin, Select_Vector) {
-    GlobalVar("a", vec2<i32>(1_i, 2_i), builtin::AddressSpace::kPrivate);
-    GlobalVar("b", vec2<i32>(3_i, 4_i), builtin::AddressSpace::kPrivate);
-    auto* call = Call("select", "a", "b", vec2<bool>(true, false));
+    GlobalVar("a", Call<vec2<i32>>(1_i, 2_i), builtin::AddressSpace::kPrivate);
+    GlobalVar("b", Call<vec2<i32>>(3_i, 4_i), builtin::AddressSpace::kPrivate);
+    auto* call = Call("select", "a", "b", Call<vec2<bool>>(true, false));
     WrapInFunction(Decl(Var("r", call)));
     GeneratorImpl& gen = Build();
 
@@ -435,7 +436,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Builtin, Runtime_Modf_Vector_f32) {
-    WrapInFunction(Decl(Let("f", vec3<f32>(1.5_f, 2.5_f, 3.5_f))),  //
+    WrapInFunction(Decl(Let("f", Call<vec3<f32>>(1.5_f, 2.5_f, 3.5_f))),  //
                    Decl(Let("v", Call("modf", "f"))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -463,7 +464,7 @@
 TEST_F(HlslGeneratorImplTest_Builtin, Runtime_Modf_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(Decl(Let("f", vec3<f16>(1.5_h, 2.5_h, 3.5_h))),  //
+    WrapInFunction(Decl(Let("f", Call<vec3<f16>>(1.5_h, 2.5_h, 3.5_h))),  //
                    Decl(Let("v", Call("modf", "f"))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -527,7 +528,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Builtin, Const_Modf_Vector_f32) {
-    WrapInFunction(Decl(Let("v", Call("modf", vec3<f32>(1.5_f, 2.5_f, 3.5_f)))));
+    WrapInFunction(Decl(Let("v", Call("modf", Call<vec3<f32>>(1.5_f, 2.5_f, 3.5_f)))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
 
@@ -547,7 +548,7 @@
 TEST_F(HlslGeneratorImplTest_Builtin, Const_Modf_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(Decl(Let("v", Call("modf", vec3<f16>(1.5_h, 2.5_h, 3.5_h)))));
+    WrapInFunction(Decl(Let("v", Call("modf", Call<vec3<f16>>(1.5_h, 2.5_h, 3.5_h)))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
 
@@ -568,10 +569,10 @@
     WrapInFunction(
         // Declare a variable with the result of a modf call.
         // This is required to infer the 'var' type.
-        Decl(Var("v", Call("modf", vec3<f32>(1.5_f, 2.5_f, 3.5_f)))),
+        Decl(Var("v", Call("modf", Call<vec3<f32>>(1.5_f, 2.5_f, 3.5_f)))),
         // Now assign 'v' again with another modf call.
         // This requires generating a temporary variable for the struct initializer.
-        Assign("v", Call("modf", vec3<f32>(4.5_a, 5.5_a, 6.5_a))));
+        Assign("v", Call("modf", Call<vec3<f32>>(4.5_a, 5.5_a, 6.5_a))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
 
@@ -647,7 +648,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Builtin, Runtime_Frexp_Vector_f32) {
-    WrapInFunction(Var("f", Expr(vec3<f32>())),  //
+    WrapInFunction(Var("f", Call<vec3<f32>>()),  //
                    Var("v", Call("frexp", "f")));
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -676,7 +677,7 @@
 TEST_F(HlslGeneratorImplTest_Builtin, Runtime_Frexp_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(Var("f", Expr(vec3<f16>())),  //
+    WrapInFunction(Var("f", Call<vec3<f16>>()),  //
                    Var("v", Call("frexp", "f")));
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -741,7 +742,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Builtin, Const_Frexp_Vector_f32) {
-    WrapInFunction(Decl(Let("v", Call("frexp", vec3<f32>()))));
+    WrapInFunction(Decl(Let("v", Call("frexp", Call<vec3<f32>>()))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
 
@@ -761,7 +762,7 @@
 TEST_F(HlslGeneratorImplTest_Builtin, Const_Frexp_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(Decl(Let("v", Call("frexp", vec3<f16>()))));
+    WrapInFunction(Decl(Let("v", Call("frexp", Call<vec3<f16>>()))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
 
@@ -782,10 +783,10 @@
     WrapInFunction(
         // Declare a variable with the result of a frexp call.
         // This is required to infer the 'var' type.
-        Decl(Var("v", Call("frexp", vec3<f32>(1.5_f, 2.5_f, 3.5_f)))),
+        Decl(Var("v", Call("frexp", Call<vec3<f32>>(1.5_f, 2.5_f, 3.5_f)))),
         // Now assign 'v' again with another frexp call.
         // This requires generating a temporary variable for the struct initializer.
-        Assign("v", Call("frexp", vec3<f32>(4.5_a, 5.5_a, 6.5_a))));
+        Assign("v", Call("frexp", Call<vec3<f32>>(4.5_a, 5.5_a, 6.5_a))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
 
diff --git a/src/tint/writer/hlsl/generator_impl_cast_test.cc b/src/tint/writer/hlsl/generator_impl_cast_test.cc
index 73bc170..ac269c8 100644
--- a/src/tint/writer/hlsl/generator_impl_cast_test.cc
+++ b/src/tint/writer/hlsl/generator_impl_cast_test.cc
@@ -15,7 +15,8 @@
 #include "src/tint/utils/string_stream.h"
 #include "src/tint/writer/hlsl/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::hlsl {
 namespace {
@@ -34,7 +35,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Cast, EmitExpression_Cast_Vector) {
-    auto* cast = vec3<f32>(vec3<i32>(1_i, 2_i, 3_i));
+    auto* cast = Call<vec3<f32>>(Call<vec3<i32>>(1_i, 2_i, 3_i));
     WrapInFunction(cast);
 
     GeneratorImpl& gen = Build();
diff --git a/src/tint/writer/hlsl/generator_impl_constructor_test.cc b/src/tint/writer/hlsl/generator_impl_constructor_test.cc
index f9c41ea..38a333d 100644
--- a/src/tint/writer/hlsl/generator_impl_constructor_test.cc
+++ b/src/tint/writer/hlsl/generator_impl_constructor_test.cc
@@ -15,7 +15,8 @@
 #include "gmock/gmock.h"
 #include "src/tint/writer/hlsl/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::hlsl {
 namespace {
@@ -121,7 +122,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Vec_F32) {
-    WrapInFunction(vec3<f32>(1_f, 2_f, 3_f));
+    WrapInFunction(Call<vec3<f32>>(1_f, 2_f, 3_f));
 
     GeneratorImpl& gen = Build();
 
@@ -132,7 +133,7 @@
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Vec_F16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(vec3<f16>(1_h, 2_h, 3_h));
+    WrapInFunction(Call<vec3<f16>>(1_h, 2_h, 3_h));
 
     GeneratorImpl& gen = Build();
 
@@ -143,7 +144,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Vec_Empty_F32) {
-    WrapInFunction(vec3<f32>());
+    WrapInFunction(Call<vec3<f32>>());
 
     GeneratorImpl& gen = Build();
 
@@ -154,7 +155,7 @@
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Vec_Empty_F16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(vec3<f16>());
+    WrapInFunction(Call<vec3<f16>>());
 
     GeneratorImpl& gen = Build();
 
@@ -163,7 +164,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_F32_Literal) {
-    WrapInFunction(vec3<f32>(2_f));
+    WrapInFunction(Call<vec3<f32>>(2_f));
 
     GeneratorImpl& gen = Build();
 
@@ -174,7 +175,7 @@
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_F16_Literal) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(vec3<f16>(2_h));
+    WrapInFunction(Call<vec3<f16>>(2_h));
 
     GeneratorImpl& gen = Build();
 
@@ -184,7 +185,7 @@
 
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_F32_Var) {
     auto* var = Var("v", Expr(2_f));
-    auto* cast = vec3<f32>(var);
+    auto* cast = Call<vec3<f32>>(var);
     WrapInFunction(var, cast);
 
     GeneratorImpl& gen = Build();
@@ -198,7 +199,7 @@
     Enable(builtin::Extension::kF16);
 
     auto* var = Var("v", Expr(2_h));
-    auto* cast = vec3<f16>(var);
+    auto* cast = Call<vec3<f16>>(var);
     WrapInFunction(var, cast);
 
     GeneratorImpl& gen = Build();
@@ -209,7 +210,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_Bool_Literal) {
-    WrapInFunction(vec3<bool>(true));
+    WrapInFunction(Call<vec3<bool>>(true));
 
     GeneratorImpl& gen = Build();
 
@@ -219,7 +220,7 @@
 
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_Bool_Var) {
     auto* var = Var("v", Expr(true));
-    auto* cast = vec3<bool>(var);
+    auto* cast = Call<vec3<bool>>(var);
     WrapInFunction(var, cast);
 
     GeneratorImpl& gen = Build();
@@ -230,7 +231,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_Int) {
-    WrapInFunction(vec3<i32>(2_i));
+    WrapInFunction(Call<vec3<i32>>(2_i));
 
     GeneratorImpl& gen = Build();
 
@@ -239,7 +240,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_UInt) {
-    WrapInFunction(vec3<u32>(2_u));
+    WrapInFunction(Call<vec3<u32>>(2_u));
 
     GeneratorImpl& gen = Build();
 
@@ -248,7 +249,8 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Mat_F32) {
-    WrapInFunction(mat2x3<f32>(vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(3_f, 4_f, 5_f)));
+    WrapInFunction(
+        Call<mat2x3<f32>>(Call<vec3<f32>>(1_f, 2_f, 3_f), Call<vec3<f32>>(3_f, 4_f, 5_f)));
 
     GeneratorImpl& gen = Build();
 
@@ -261,7 +263,8 @@
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Mat_F16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(mat2x3<f16>(vec3<f16>(1_h, 2_h, 3_h), vec3<f16>(3_h, 4_h, 5_h)));
+    WrapInFunction(
+        Call<mat2x3<f16>>(Call<vec3<f16>>(1_h, 2_h, 3_h), Call<vec3<f16>>(3_h, 4_h, 5_h)));
 
     GeneratorImpl& gen = Build();
 
@@ -280,15 +283,14 @@
     //     vec4<f32>(7.0f),
     //     vec4<f32>(vec4<f32>(42.0f, 21.0f, 6.0f, -5.0f)),
     //   );
-    auto* vector_literal =
-        vec4<f32>(Expr(f32(2.0)), Expr(f32(3.0)), Expr(f32(4.0)), Expr(f32(8.0)));
-    auto* vector_zero_init = vec4<f32>();
-    auto* vector_single_scalar_init = vec4<f32>(Expr(f32(7.0)));
+    auto* vector_literal = Call<vec4<f32>>(f32(2.0), f32(3.0), f32(4.0), f32(8.0));
+    auto* vector_zero_init = Call<vec4<f32>>();
+    auto* vector_single_scalar_init = Call<vec4<f32>>(f32(7.0));
     auto* vector_identical_init =
-        vec4<f32>(vec4<f32>(Expr(f32(42.0)), Expr(f32(21.0)), Expr(f32(6.0)), Expr(f32(-5.0))));
+        Call<vec4<f32>>(Call<vec4<f32>>(f32(42.0), f32(21.0), f32(6.0), f32(-5.0)));
 
-    auto* constructor = mat4x4<f32>(vector_literal, vector_zero_init, vector_single_scalar_init,
-                                    vector_identical_init);
+    auto* constructor = Call<mat4x4<f32>>(vector_literal, vector_zero_init,
+                                          vector_single_scalar_init, vector_identical_init);
 
     WrapInFunction(constructor);
 
@@ -309,15 +311,14 @@
     //   );
     Enable(builtin::Extension::kF16);
 
-    auto* vector_literal =
-        vec4<f16>(Expr(f16(2.0)), Expr(f16(3.0)), Expr(f16(4.0)), Expr(f16(8.0)));
-    auto* vector_zero_init = vec4<f16>();
-    auto* vector_single_scalar_init = vec4<f16>(Expr(f16(7.0)));
+    auto* vector_literal = Call<vec4<f16>>(f16(2.0), f16(3.0), f16(4.0), f16(8.0));
+    auto* vector_zero_init = Call<vec4<f16>>();
+    auto* vector_single_scalar_init = Call<vec4<f16>>(f16(7.0));
     auto* vector_identical_init =
-        vec4<f16>(vec4<f16>(Expr(f16(42.0)), Expr(f16(21.0)), Expr(f16(6.0)), Expr(f16(-5.0))));
+        Call<vec4<f16>>(Call<vec4<f16>>(f16(42.0), f16(21.0), f16(6.0), f16(-5.0)));
 
-    auto* constructor = mat4x4<f16>(vector_literal, vector_zero_init, vector_single_scalar_init,
-                                    vector_identical_init);
+    auto* constructor = Call<mat4x4<f16>>(vector_literal, vector_zero_init,
+                                          vector_single_scalar_init, vector_identical_init);
 
     WrapInFunction(constructor);
 
@@ -334,7 +335,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Mat_Empty_F32) {
-    WrapInFunction(mat2x3<f32>());
+    WrapInFunction(Call<mat2x3<f32>>());
 
     GeneratorImpl& gen = Build();
 
@@ -346,7 +347,7 @@
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Mat_Empty_F16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(mat2x3<f16>());
+    WrapInFunction(Call<mat2x3<f16>>());
 
     GeneratorImpl& gen = Build();
 
@@ -362,8 +363,8 @@
     //     var m_2: mat4x4<f32> = mat4x4<f32>(m_1);
     // }
 
-    auto* m_1 = Var("m_1", ty.mat4x4(ty.f32()), mat4x4<f32>());
-    auto* m_2 = Var("m_2", ty.mat4x4(ty.f32()), mat4x4<f32>(m_1));
+    auto* m_1 = Var("m_1", ty.mat4x4(ty.f32()), Call<mat4x4<f32>>());
+    auto* m_2 = Var("m_2", ty.mat4x4(ty.f32()), Call<mat4x4<f32>>(m_1));
 
     WrapInFunction(m_1, m_2);
 
@@ -382,8 +383,8 @@
 
     Enable(builtin::Extension::kF16);
 
-    auto* m_1 = Var("m_1", ty.mat4x4(ty.f16()), mat4x4<f16>());
-    auto* m_2 = Var("m_2", ty.mat4x4(ty.f16()), mat4x4<f16>(m_1));
+    auto* m_1 = Var("m_1", ty.mat4x4(ty.f16()), Call<mat4x4<f16>>());
+    auto* m_2 = Var("m_2", ty.mat4x4(ty.f16()), Call<mat4x4<f16>>(m_1));
 
     WrapInFunction(m_1, m_2);
 
@@ -396,8 +397,9 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Array) {
-    WrapInFunction(Call(ty.array(ty.vec3<f32>(), 3_u), vec3<f32>(1_f, 2_f, 3_f),
-                        vec3<f32>(4_f, 5_f, 6_f), vec3<f32>(7_f, 8_f, 9_f)));
+    WrapInFunction(Call<array<vec3<f32>, 3>>(Call<vec3<f32>>(1_f, 2_f, 3_f),
+                                             Call<vec3<f32>>(4_f, 5_f, 6_f),
+                                             Call<vec3<f32>>(7_f, 8_f, 9_f)));
 
     GeneratorImpl& gen = Build();
 
@@ -409,7 +411,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Constructor, Type_Array_Empty) {
-    WrapInFunction(Call(ty.array(ty.vec3<f32>(), 3_u)));
+    WrapInFunction(Call<array<vec3<f32>, 3>>());
 
     GeneratorImpl& gen = Build();
 
@@ -424,7 +426,7 @@
                                    Member("c", ty.vec3<i32>()),
                                });
 
-    WrapInFunction(Call(ty.Of(str), 1_i, 2_f, vec3<i32>(3_i, 4_i, 5_i)));
+    WrapInFunction(Call(ty.Of(str), 1_i, 2_f, Call<vec3<i32>>(3_i, 4_i, 5_i)));
 
     GeneratorImpl& gen = SanitizeAndBuild();
 
diff --git a/src/tint/writer/hlsl/generator_impl_function_test.cc b/src/tint/writer/hlsl/generator_impl_function_test.cc
index 37d94c3..a374924 100644
--- a/src/tint/writer/hlsl/generator_impl_function_test.cc
+++ b/src/tint/writer/hlsl/generator_impl_function_test.cc
@@ -20,11 +20,12 @@
 
 using ::testing::HasSubstr;
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::writer::hlsl {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using HlslGeneratorImplTest_Function = TestHelper;
 
 TEST_F(HlslGeneratorImplTest_Function, Emit_Function) {
@@ -101,7 +102,7 @@
     // fn f(foo : ptr<function, f32>) -> f32 {
     //   return *foo;
     // }
-    Func("f", utils::Vector{Param("foo", ty.ptr<f32>(builtin::AddressSpace::kFunction))}, ty.f32(),
+    Func("f", utils::Vector{Param("foo", ty.ptr<function, f32>())}, ty.f32(),
          utils::Vector{Return(Deref("foo"))});
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -216,7 +217,7 @@
 
     Func("vert_main", utils::Empty, ty.Of(interface_struct),
          utils::Vector{
-             Return(Call(ty.Of(interface_struct), Call(ty.vec4<f32>()), Expr(0.5_f), Expr(0.25_f))),
+             Return(Call(ty.Of(interface_struct), Call<vec4<f32>>(), 0.5_f, 0.25_f)),
          },
          utils::Vector{Stage(ast::PipelineStage::kVertex)});
 
@@ -296,8 +297,7 @@
 
     Func("foo", utils::Vector{Param("x", ty.f32())}, ty.Of(vertex_output_struct),
          utils::Vector{
-             Return(
-                 Call(ty.Of(vertex_output_struct), Call(ty.vec4<f32>(), "x", "x", "x", Expr(1_f)))),
+             Return(Call(ty.Of(vertex_output_struct), Call<vec4<f32>>("x", "x", "x", 1_f))),
          },
          utils::Empty);
 
@@ -752,7 +752,7 @@
 TEST_F(HlslGeneratorImplTest_Function, Emit_Function_WithArrayReturn) {
     Func("my_func", utils::Empty, ty.array<f32, 5>(),
          utils::Vector{
-             Return(Call(ty.array<f32, 5>())),
+             Return(Call<array<f32, 5>>()),
          });
 
     GeneratorImpl& gen = Build();
diff --git a/src/tint/writer/hlsl/generator_impl_import_test.cc b/src/tint/writer/hlsl/generator_impl_import_test.cc
index 67af40d..17efb89 100644
--- a/src/tint/writer/hlsl/generator_impl_import_test.cc
+++ b/src/tint/writer/hlsl/generator_impl_import_test.cc
@@ -15,7 +15,8 @@
 #include "src/tint/utils/string_stream.h"
 #include "src/tint/writer/hlsl/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::hlsl {
 namespace {
@@ -89,7 +90,7 @@
 TEST_P(HlslImportData_SingleVectorParamTest, FloatVector) {
     auto param = GetParam();
 
-    auto* expr = Call(param.name, vec3<f32>(0.1_f, 0.2_f, 0.3_f));
+    auto* expr = Call(param.name, Call<vec3<f32>>(0.1_f, 0.2_f, 0.3_f));
     WrapInFunction(expr);
 
     GeneratorImpl& gen = Build();
@@ -152,7 +153,7 @@
 TEST_P(HlslImportData_DualParam_VectorTest, Float) {
     auto param = GetParam();
 
-    auto* expr = Call(param.name, vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(4_f, 5_f, 6_f));
+    auto* expr = Call(param.name, Call<vec3<f32>>(1_f, 2_f, 3_f), Call<vec3<f32>>(4_f, 5_f, 6_f));
     WrapInFunction(expr);
 
     GeneratorImpl& gen = Build();
@@ -215,8 +216,8 @@
 TEST_P(HlslImportData_TripleParam_VectorTest, Float) {
     auto param = GetParam();
 
-    auto* expr = Call(param.name, vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(4_f, 5_f, 6_f),
-                      vec3<f32>(7_f, 8_f, 9_f));
+    auto* expr = Call(param.name, Call<vec3<f32>>(1_f, 2_f, 3_f), Call<vec3<f32>>(4_f, 5_f, 6_f),
+                      Call<vec3<f32>>(7_f, 8_f, 9_f));
     WrapInFunction(expr);
 
     GeneratorImpl& gen = Build();
@@ -279,7 +280,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Import, HlslImportData_QuantizeToF16_Vector) {
-    GlobalVar("v", vec3<f32>(2_f), builtin::AddressSpace::kPrivate);
+    GlobalVar("v", Call<vec3<f32>>(2_f), builtin::AddressSpace::kPrivate);
 
     auto* expr = Call("quantizeToF16", "v");
     WrapInFunction(expr);
diff --git a/src/tint/writer/hlsl/generator_impl_member_accessor_test.cc b/src/tint/writer/hlsl/generator_impl_member_accessor_test.cc
index 389b8f2..6232315 100644
--- a/src/tint/writer/hlsl/generator_impl_member_accessor_test.cc
+++ b/src/tint/writer/hlsl/generator_impl_member_accessor_test.cc
@@ -18,11 +18,12 @@
 
 using ::testing::HasSubstr;
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::writer::hlsl {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using create_type_func_ptr = ast::Type (*)(const ProgramBuilder::TypesBuilder& ty);
 
 inline ast::Type ty_i32(const ProgramBuilder::TypesBuilder& ty) {
@@ -1133,7 +1134,7 @@
     });
 
     SetupFunction(utils::Vector{
-        Assign(MemberAccessor("data", "b"), Call(ty.mat2x3<f32>())),
+        Assign(MemberAccessor("data", "b"), Call<mat2x3<f32>>()),
     });
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -1330,7 +1331,7 @@
 
     SetupUniformBuffer(utils::Vector{
         Member("z", ty.f32()),
-        Member("a", ty.array(ty.vec4(ty.i32()), 5_i)),
+        Member("a", ty.array<vec4<i32>, 5>()),
     });
 
     SetupFunction(utils::Vector{
@@ -1505,7 +1506,7 @@
 
     SetupUniformBuffer(utils::Vector{
         Member("z", ty.f32()),
-        Member("a", ty.array(ty.vec4(ty.i32()), 5_i)),
+        Member("a", ty.array<vec4<i32>, 5>()),
     });
 
     SetupFunction(utils::Vector{
@@ -1922,7 +1923,7 @@
 
     SetupFunction(utils::Vector{
         Assign(MemberAccessor(IndexAccessor(MemberAccessor("data", "c"), 2_i), "b"),
-               vec3<f32>(1_f, 2_f, 3_f)),
+               Call<vec3<f32>>(1_f, 2_f, 3_f)),
     });
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -1981,7 +1982,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_MemberAccessor, Swizzle_xyz) {
-    auto* var = Var("my_vec", ty.vec4<f32>(), vec4<f32>(1_f, 2_f, 3_f, 4_f));
+    auto* var = Var("my_vec", ty.vec4<f32>(), Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f));
     auto* expr = MemberAccessor("my_vec", "xyz");
     WrapInFunction(var, expr);
 
@@ -1991,7 +1992,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_MemberAccessor, Swizzle_gbr) {
-    auto* var = Var("my_vec", ty.vec4<f32>(), vec4<f32>(1_f, 2_f, 3_f, 4_f));
+    auto* var = Var("my_vec", ty.vec4<f32>(), Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f));
     auto* expr = MemberAccessor("my_vec", "gbr");
     WrapInFunction(var, expr);
 
diff --git a/src/tint/writer/hlsl/generator_impl_module_constant_test.cc b/src/tint/writer/hlsl/generator_impl_module_constant_test.cc
index e7805a7..009b85a 100644
--- a/src/tint/writer/hlsl/generator_impl_module_constant_test.cc
+++ b/src/tint/writer/hlsl/generator_impl_module_constant_test.cc
@@ -15,7 +15,8 @@
 #include "src/tint/ast/id_attribute.h"
 #include "src/tint/writer/hlsl/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::hlsl {
 namespace {
@@ -109,7 +110,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_vec3_AInt) {
-    auto* var = GlobalConst("G", Call(ty.vec3<Infer>(), 1_a, 2_a, 3_a));
+    auto* var = GlobalConst("G", Call<vec3<Infer>>(1_a, 2_a, 3_a));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
@@ -123,7 +124,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_vec3_AFloat) {
-    auto* var = GlobalConst("G", Call(ty.vec3<Infer>(), 1._a, 2._a, 3._a));
+    auto* var = GlobalConst("G", Call<vec3<Infer>>(1._a, 2._a, 3._a));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
@@ -137,7 +138,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_vec3_f32) {
-    auto* var = GlobalConst("G", vec3<f32>(1_f, 2_f, 3_f));
+    auto* var = GlobalConst("G", Call<vec3<f32>>(1_f, 2_f, 3_f));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
@@ -153,7 +154,7 @@
 TEST_F(HlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_vec3_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = GlobalConst("G", vec3<f16>(1_h, 2_h, 3_h));
+    auto* var = GlobalConst("G", Call<vec3<f16>>(1_h, 2_h, 3_h));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
@@ -167,7 +168,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_mat2x3_AFloat) {
-    auto* var = GlobalConst("G", Call(ty.mat2x3<Infer>(), 1._a, 2._a, 3._a, 4._a, 5._a, 6._a));
+    auto* var = GlobalConst("G", Call<mat2x3<Infer>>(1._a, 2._a, 3._a, 4._a, 5._a, 6._a));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
@@ -181,7 +182,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_mat2x3_f32) {
-    auto* var = GlobalConst("G", mat2x3<f32>(1_f, 2_f, 3_f, 4_f, 5_f, 6_f));
+    auto* var = GlobalConst("G", Call<mat2x3<f32>>(1_f, 2_f, 3_f, 4_f, 5_f, 6_f));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
@@ -197,7 +198,7 @@
 TEST_F(HlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_mat2x3_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = GlobalConst("G", mat2x3<f16>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
+    auto* var = GlobalConst("G", Call<mat2x3<f16>>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
@@ -211,7 +212,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_arr_f32) {
-    auto* var = GlobalConst("G", Call(ty.array<f32, 3>(), 1_f, 2_f, 3_f));
+    auto* var = GlobalConst("G", Call<array<f32, 3>>(1_f, 2_f, 3_f));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
@@ -225,10 +226,10 @@
 }
 
 TEST_F(HlslGeneratorImplTest_ModuleConstant, Emit_GlobalConst_arr_vec2_bool) {
-    auto* var = GlobalConst("G", Call(ty.array(ty.vec2<bool>(), 3_u),  //
-                                      vec2<bool>(true, false),         //
-                                      vec2<bool>(false, true),         //
-                                      vec2<bool>(true, true)));
+    auto* var = GlobalConst("G", Call<array<vec2<bool>, 3>>(         //
+                                     Call<vec2<bool>>(true, false),  //
+                                     Call<vec2<bool>>(false, true),  //
+                                     Call<vec2<bool>>(true, true)));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
diff --git a/src/tint/writer/hlsl/generator_impl_sanitizer_test.cc b/src/tint/writer/hlsl/generator_impl_sanitizer_test.cc
index b1fef10..473e623 100644
--- a/src/tint/writer/hlsl/generator_impl_sanitizer_test.cc
+++ b/src/tint/writer/hlsl/generator_impl_sanitizer_test.cc
@@ -17,7 +17,8 @@
 #include "src/tint/ast/variable_decl_statement.h"
 #include "src/tint/writer/hlsl/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::hlsl {
 namespace {
@@ -170,7 +171,7 @@
 }
 
 TEST_F(HlslSanitizerTest, PromoteArrayInitializerToConstVar) {
-    auto* array_init = array<i32, 4>(1_i, 2_i, 3_i, 4_i);
+    auto* array_init = Call<array<i32, 4>>(1_i, 2_i, 3_i, 4_i);
 
     Func("main", utils::Empty, ty.void_(),
          utils::Vector{
@@ -203,7 +204,7 @@
                                    Member("b", ty.vec3<f32>()),
                                    Member("c", ty.i32()),
                                });
-    auto* struct_init = Call(ty.Of(str), 1_i, vec3<f32>(2_f, runtime_value, 4_f), 4_i);
+    auto* struct_init = Call(ty.Of(str), 1_i, Call<vec3<f32>>(2_f, runtime_value, 4_f), 4_i);
     auto* struct_access = MemberAccessor(struct_init, "b");
     auto* pos = Var("pos", ty.vec3<f32>(), struct_access);
 
@@ -242,7 +243,7 @@
     // let p : ptr<function, i32> = &v;
     // let x : i32 = *p;
     auto* v = Var("v", ty.i32());
-    auto* p = Let("p", ty.ptr<i32>(builtin::AddressSpace::kFunction), AddressOf(v));
+    auto* p = Let("p", ty.ptr<function, i32>(), AddressOf(v));
     auto* x = Var("x", ty.i32(), Deref(p));
 
     Func("main", utils::Empty, ty.void_(),
@@ -276,12 +277,9 @@
     // let vp : ptr<function, vec4<f32>> = &(*mp)[2i];
     // let v : vec4<f32> = *vp;
     auto* a = Var("a", ty.array(ty.mat4x4<f32>(), 4_u));
-    auto* ap = Let("ap", ty.ptr(builtin::AddressSpace::kFunction, ty.array(ty.mat4x4<f32>(), 4_u)),
-                   AddressOf(a));
-    auto* mp = Let("mp", ty.ptr(builtin::AddressSpace::kFunction, ty.mat4x4<f32>()),
-                   AddressOf(IndexAccessor(Deref(ap), 3_i)));
-    auto* vp = Let("vp", ty.ptr(builtin::AddressSpace::kFunction, ty.vec4<f32>()),
-                   AddressOf(IndexAccessor(Deref(mp), 2_i)));
+    auto* ap = Let("ap", ty.ptr<function, array<mat4x4<f32>, 4>>(), AddressOf(a));
+    auto* mp = Let("mp", ty.ptr<function, mat4x4<f32>>(), AddressOf(IndexAccessor(Deref(ap), 3_i)));
+    auto* vp = Let("vp", ty.ptr<function, vec4<f32>>(), AddressOf(IndexAccessor(Deref(mp), 2_i)));
     auto* v = Var("v", ty.vec4<f32>(), Deref(vp));
 
     Func("main", utils::Empty, ty.void_(),
diff --git a/src/tint/writer/hlsl/generator_impl_variable_decl_statement_test.cc b/src/tint/writer/hlsl/generator_impl_variable_decl_statement_test.cc
index f50ab58..f53eee2 100644
--- a/src/tint/writer/hlsl/generator_impl_variable_decl_statement_test.cc
+++ b/src/tint/writer/hlsl/generator_impl_variable_decl_statement_test.cc
@@ -16,11 +16,12 @@
 #include "src/tint/ast/variable_decl_statement.h"
 #include "src/tint/writer/hlsl/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::writer::hlsl {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using ::testing::HasSubstr;
 
 using HlslGeneratorImplTest_VariableDecl = TestHelper;
@@ -175,7 +176,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_vec3_AInt) {
-    auto* C = Const("C", Call(ty.vec3<Infer>(), 1_a, 2_a, 3_a));
+    auto* C = Const("C", Call<vec3<Infer>>(1_a, 2_a, 3_a));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -193,7 +194,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_vec3_AFloat) {
-    auto* C = Const("C", Call(ty.vec3<Infer>(), 1._a, 2._a, 3._a));
+    auto* C = Const("C", Call<vec3<Infer>>(1._a, 2._a, 3._a));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -211,7 +212,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_vec3_f32) {
-    auto* C = Const("C", vec3<f32>(1_f, 2_f, 3_f));
+    auto* C = Const("C", Call<vec3<f32>>(1_f, 2_f, 3_f));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -231,7 +232,7 @@
 TEST_F(HlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_vec3_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* C = Const("C", vec3<f16>(1_h, 2_h, 3_h));
+    auto* C = Const("C", Call<vec3<f16>>(1_h, 2_h, 3_h));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -249,7 +250,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_mat2x3_AFloat) {
-    auto* C = Const("C", Call(ty.mat2x3<Infer>(), 1._a, 2._a, 3._a, 4._a, 5._a, 6._a));
+    auto* C = Const("C", Call<mat2x3<Infer>>(1._a, 2._a, 3._a, 4._a, 5._a, 6._a));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -267,7 +268,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_mat2x3_f32) {
-    auto* C = Const("C", mat2x3<f32>(1_f, 2_f, 3_f, 4_f, 5_f, 6_f));
+    auto* C = Const("C", Call<mat2x3<f32>>(1_f, 2_f, 3_f, 4_f, 5_f, 6_f));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -287,7 +288,7 @@
 TEST_F(HlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_mat2x3_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* C = Const("C", mat2x3<f16>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
+    auto* C = Const("C", Call<mat2x3<f16>>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -323,10 +324,10 @@
 }
 
 TEST_F(HlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const_arr_vec2_bool) {
-    auto* C = Const("C", Call(ty.array(ty.vec2<bool>(), 3_u),  //
-                              vec2<bool>(true, false),         //
-                              vec2<bool>(false, true),         //
-                              vec2<bool>(true, true)));
+    auto* C = Const("C", Call<array<vec2<bool>, 3>>(         //
+                             Call<vec2<bool>>(true, false),  //
+                             Call<vec2<bool>>(false, true),  //
+                             Call<vec2<bool>>(true, true)));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -370,7 +371,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Initializer_ZeroVec_F32) {
-    auto* var = Var("a", ty.vec3<f32>(), vec3<f32>());
+    auto* var = Var("a", ty.vec3<f32>(), Call<vec3<f32>>());
 
     auto* stmt = Decl(var);
     WrapInFunction(stmt);
@@ -385,7 +386,7 @@
 TEST_F(HlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Initializer_ZeroVec_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Var("a", ty.vec3<f16>(), vec3<f16>());
+    auto* var = Var("a", ty.vec3<f16>(), Call<vec3<f16>>());
 
     auto* stmt = Decl(var);
     WrapInFunction(stmt);
@@ -398,7 +399,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Initializer_ZeroMat_F32) {
-    auto* var = Var("a", ty.mat2x3<f32>(), mat2x3<f32>());
+    auto* var = Var("a", ty.mat2x3<f32>(), Call<mat2x3<f32>>());
 
     auto* stmt = Decl(var);
     WrapInFunction(stmt);
@@ -414,7 +415,7 @@
 TEST_F(HlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Initializer_ZeroMat_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Var("a", ty.mat2x3<f16>(), mat2x3<f16>());
+    auto* var = Var("a", ty.mat2x3<f16>(), Call<mat2x3<f16>>());
 
     auto* stmt = Decl(var);
     WrapInFunction(stmt);
diff --git a/src/tint/writer/msl/generator_impl_builtin_test.cc b/src/tint/writer/msl/generator_impl_builtin_test.cc
index 5a38ba2..aae56b1 100644
--- a/src/tint/writer/msl/generator_impl_builtin_test.cc
+++ b/src/tint/writer/msl/generator_impl_builtin_test.cc
@@ -17,7 +17,8 @@
 #include "src/tint/utils/string_stream.h"
 #include "src/tint/writer/msl/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::msl {
 namespace {
@@ -473,7 +474,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Runtime_Modf_Vector_f32) {
-    WrapInFunction(Decl(Let("f", vec3<f32>(1.5_f, 2.5_f, 3.5_f))),  //
+    WrapInFunction(Decl(Let("f", Call<vec3<f32>>(1.5_f, 2.5_f, 3.5_f))),  //
                    Decl(Let("v", Call("modf", "f"))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -505,7 +506,7 @@
 TEST_F(MslGeneratorImplTest, Runtime_Modf_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(Decl(Let("f", vec3<f16>(1.5_h, 2.5_h, 3.5_h))),  //
+    WrapInFunction(Decl(Let("f", Call<vec3<f16>>(1.5_h, 2.5_h, 3.5_h))),  //
                    Decl(Let("v", Call("modf", "f"))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -581,7 +582,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Const_Modf_Vector_f32) {
-    WrapInFunction(Decl(Let("v", Call("modf", vec3<f32>(1.5_f, 2.5_f, 3.5_f)))));
+    WrapInFunction(Decl(Let("v", Call("modf", Call<vec3<f32>>(1.5_f, 2.5_f, 3.5_f)))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
 
@@ -605,7 +606,7 @@
 TEST_F(MslGeneratorImplTest, Const_Modf_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(Decl(Let("v", Call("modf", vec3<f16>(1.5_h, 2.5_h, 3.5_h)))));
+    WrapInFunction(Decl(Let("v", Call("modf", Call<vec3<f16>>(1.5_h, 2.5_h, 3.5_h)))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
 
@@ -689,7 +690,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Runtime_Frexp_Vector_f32) {
-    WrapInFunction(Var("f", Expr(vec3<f32>())),  //
+    WrapInFunction(Var("f", Call<vec3<f32>>()),  //
                    Var("v", Call("frexp", "f")));
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -721,7 +722,7 @@
 TEST_F(MslGeneratorImplTest, Runtime_Frexp_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(Var("f", Expr(vec3<f16>())),  //
+    WrapInFunction(Var("f", Call<vec3<f16>>()),  //
                    Var("v", Call("frexp", "f")));
 
     GeneratorImpl& gen = SanitizeAndBuild();
@@ -797,7 +798,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Const_Frexp_Vector_f32) {
-    WrapInFunction(Decl(Let("v", Call("frexp", vec3<f32>()))));
+    WrapInFunction(Decl(Let("v", Call("frexp", Call<vec3<f32>>()))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
 
@@ -821,7 +822,7 @@
 TEST_F(MslGeneratorImplTest, Const_Frexp_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(Decl(Let("v", Call("frexp", vec3<f16>()))));
+    WrapInFunction(Decl(Let("v", Call("frexp", Call<vec3<f16>>()))));
 
     GeneratorImpl& gen = SanitizeAndBuild();
 
diff --git a/src/tint/writer/msl/generator_impl_cast_test.cc b/src/tint/writer/msl/generator_impl_cast_test.cc
index 78d6c58..77d2119 100644
--- a/src/tint/writer/msl/generator_impl_cast_test.cc
+++ b/src/tint/writer/msl/generator_impl_cast_test.cc
@@ -15,7 +15,8 @@
 #include "src/tint/utils/string_stream.h"
 #include "src/tint/writer/msl/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::msl {
 namespace {
@@ -34,7 +35,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitExpression_Cast_Vector) {
-    auto* cast = vec3<f32>(vec3<i32>(1_i, 2_i, 3_i));
+    auto* cast = Call<vec3<f32>>(Call<vec3<i32>>(1_i, 2_i, 3_i));
     WrapInFunction(cast);
 
     GeneratorImpl& gen = Build();
diff --git a/src/tint/writer/msl/generator_impl_constructor_test.cc b/src/tint/writer/msl/generator_impl_constructor_test.cc
index b3a333e..22b7d5e 100644
--- a/src/tint/writer/msl/generator_impl_constructor_test.cc
+++ b/src/tint/writer/msl/generator_impl_constructor_test.cc
@@ -15,7 +15,8 @@
 #include "gmock/gmock.h"
 #include "src/tint/writer/msl/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::msl {
 namespace {
@@ -121,7 +122,7 @@
 }
 
 TEST_F(MslGeneratorImplTest_Constructor, Type_Vec_F32) {
-    WrapInFunction(vec3<f32>(1_f, 2_f, 3_f));
+    WrapInFunction(Call<vec3<f32>>(1_f, 2_f, 3_f));
 
     GeneratorImpl& gen = Build();
 
@@ -132,7 +133,7 @@
 TEST_F(MslGeneratorImplTest_Constructor, Type_Vec_F16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(vec3<f16>(1_h, 2_h, 3_h));
+    WrapInFunction(Call<vec3<f16>>(1_h, 2_h, 3_h));
 
     GeneratorImpl& gen = Build();
 
@@ -141,7 +142,7 @@
 }
 
 TEST_F(MslGeneratorImplTest_Constructor, Type_Vec_Empty_F32) {
-    WrapInFunction(vec3<f32>());
+    WrapInFunction(Call<vec3<f32>>());
 
     GeneratorImpl& gen = Build();
 
@@ -152,7 +153,7 @@
 TEST_F(MslGeneratorImplTest_Constructor, Type_Vec_Empty_F16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(vec3<f16>());
+    WrapInFunction(Call<vec3<f16>>());
 
     GeneratorImpl& gen = Build();
 
@@ -161,7 +162,7 @@
 }
 
 TEST_F(MslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_F32_Literal) {
-    WrapInFunction(vec3<f32>(2_f));
+    WrapInFunction(Call<vec3<f32>>(2_f));
 
     GeneratorImpl& gen = Build();
 
@@ -172,7 +173,7 @@
 TEST_F(MslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_F16_Literal) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(vec3<f16>(2_h));
+    WrapInFunction(Call<vec3<f16>>(2_h));
 
     GeneratorImpl& gen = Build();
 
@@ -182,7 +183,7 @@
 
 TEST_F(MslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_F32_Var) {
     auto* var = Var("v", Expr(2_f));
-    auto* cast = vec3<f32>(var);
+    auto* cast = Call<vec3<f32>>(var);
     WrapInFunction(var, cast);
 
     GeneratorImpl& gen = Build();
@@ -196,7 +197,7 @@
     Enable(builtin::Extension::kF16);
 
     auto* var = Var("v", Expr(2_h));
-    auto* cast = vec3<f16>(var);
+    auto* cast = Call<vec3<f16>>(var);
     WrapInFunction(var, cast);
 
     GeneratorImpl& gen = Build();
@@ -207,7 +208,7 @@
 }
 
 TEST_F(MslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_Bool) {
-    WrapInFunction(vec3<bool>(true));
+    WrapInFunction(Call<vec3<bool>>(true));
 
     GeneratorImpl& gen = Build();
 
@@ -216,7 +217,7 @@
 }
 
 TEST_F(MslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_Int) {
-    WrapInFunction(vec3<i32>(2_i));
+    WrapInFunction(Call<vec3<i32>>(2_i));
 
     GeneratorImpl& gen = Build();
 
@@ -225,7 +226,7 @@
 }
 
 TEST_F(MslGeneratorImplTest_Constructor, Type_Vec_SingleScalar_UInt) {
-    WrapInFunction(vec3<u32>(2_u));
+    WrapInFunction(Call<vec3<u32>>(2_u));
 
     GeneratorImpl& gen = Build();
 
@@ -234,7 +235,8 @@
 }
 
 TEST_F(MslGeneratorImplTest_Constructor, Type_Mat_F32) {
-    WrapInFunction(mat2x3<f32>(vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(3_f, 4_f, 5_f)));
+    WrapInFunction(
+        Call<mat2x3<f32>>(Call<vec3<f32>>(1_f, 2_f, 3_f), Call<vec3<f32>>(3_f, 4_f, 5_f)));
 
     GeneratorImpl& gen = Build();
 
@@ -247,7 +249,8 @@
 TEST_F(MslGeneratorImplTest_Constructor, Type_Mat_F16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(mat2x3<f16>(vec3<f16>(1_h, 2_h, 3_h), vec3<f16>(3_h, 4_h, 5_h)));
+    WrapInFunction(
+        Call<mat2x3<f16>>(Call<vec3<f16>>(1_h, 2_h, 3_h), Call<vec3<f16>>(3_h, 4_h, 5_h)));
 
     GeneratorImpl& gen = Build();
 
@@ -264,15 +267,14 @@
     //     vec4<f32>(7.0f),
     //     vec4<f32>(vec4<f32>(42.0f, 21.0f, 6.0f, -5.0f)),
     //   );
-    auto* vector_literal =
-        vec4<f32>(Expr(f32(2.0)), Expr(f32(3.0)), Expr(f32(4.0)), Expr(f32(8.0)));
-    auto* vector_zero_init = vec4<f32>();
-    auto* vector_single_scalar_init = vec4<f32>(Expr(f32(7.0)));
+    auto* vector_literal = Call<vec4<f32>>(f32(2.0), f32(3.0), f32(4.0), f32(8.0));
+    auto* vector_zero_init = Call<vec4<f32>>();
+    auto* vector_single_scalar_init = Call<vec4<f32>>(f32(7.0));
     auto* vector_identical_init =
-        vec4<f32>(vec4<f32>(Expr(f32(42.0)), Expr(f32(21.0)), Expr(f32(6.0)), Expr(f32(-5.0))));
+        Call<vec4<f32>>(Call<vec4<f32>>(f32(42.0), f32(21.0), f32(6.0), f32(-5.0)));
 
-    auto* constructor = mat4x4<f32>(vector_literal, vector_zero_init, vector_single_scalar_init,
-                                    vector_identical_init);
+    auto* constructor = Call<mat4x4<f32>>(vector_literal, vector_zero_init,
+                                          vector_single_scalar_init, vector_identical_init);
 
     WrapInFunction(constructor);
 
@@ -293,15 +295,14 @@
     //   );
     Enable(builtin::Extension::kF16);
 
-    auto* vector_literal =
-        vec4<f16>(Expr(f16(2.0)), Expr(f16(3.0)), Expr(f16(4.0)), Expr(f16(8.0)));
-    auto* vector_zero_init = vec4<f16>();
-    auto* vector_single_scalar_init = vec4<f16>(Expr(f16(7.0)));
+    auto* vector_literal = Call<vec4<f16>>(f16(2.0), f16(3.0), f16(4.0), f16(8.0));
+    auto* vector_zero_init = Call<vec4<f16>>();
+    auto* vector_single_scalar_init = Call<vec4<f16>>(f16(7.0));
     auto* vector_identical_init =
-        vec4<f16>(vec4<f16>(Expr(f16(42.0)), Expr(f16(21.0)), Expr(f16(6.0)), Expr(f16(-5.0))));
+        Call<vec4<f16>>(Call<vec4<f16>>(f16(42.0), f16(21.0), f16(6.0), f16(-5.0)));
 
-    auto* constructor = mat4x4<f16>(vector_literal, vector_zero_init, vector_single_scalar_init,
-                                    vector_identical_init);
+    auto* constructor = Call<mat4x4<f16>>(vector_literal, vector_zero_init,
+                                          vector_single_scalar_init, vector_identical_init);
 
     WrapInFunction(constructor);
 
@@ -314,7 +315,7 @@
 }
 
 TEST_F(MslGeneratorImplTest_Constructor, Type_Mat_Empty_F32) {
-    WrapInFunction(mat2x3<f32>());
+    WrapInFunction(Call<mat2x3<f32>>());
 
     GeneratorImpl& gen = Build();
 
@@ -327,7 +328,7 @@
 TEST_F(MslGeneratorImplTest_Constructor, Type_Mat_Empty_F16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(mat2x3<f16>());
+    WrapInFunction(Call<mat2x3<f16>>());
 
     GeneratorImpl& gen = Build();
 
@@ -343,8 +344,8 @@
     //     var m_2: mat4x4<f32> = mat4x4<f32>(m_1);
     // }
 
-    auto* m_1 = Var("m_1", ty.mat4x4(ty.f32()), mat4x4<f32>());
-    auto* m_2 = Var("m_2", ty.mat4x4(ty.f32()), mat4x4<f32>(m_1));
+    auto* m_1 = Var("m_1", ty.mat4x4(ty.f32()), Call<mat4x4<f32>>());
+    auto* m_2 = Var("m_2", ty.mat4x4(ty.f32()), Call<mat4x4<f32>>(m_1));
 
     WrapInFunction(m_1, m_2);
 
@@ -363,8 +364,8 @@
 
     Enable(builtin::Extension::kF16);
 
-    auto* m_1 = Var("m_1", ty.mat4x4(ty.f16()), mat4x4<f16>());
-    auto* m_2 = Var("m_2", ty.mat4x4(ty.f16()), mat4x4<f16>(m_1));
+    auto* m_1 = Var("m_1", ty.mat4x4(ty.f16()), Call<mat4x4<f16>>());
+    auto* m_2 = Var("m_2", ty.mat4x4(ty.f16()), Call<mat4x4<f16>>(m_1));
 
     WrapInFunction(m_1, m_2);
 
@@ -376,8 +377,9 @@
 }
 
 TEST_F(MslGeneratorImplTest_Constructor, Type_Array) {
-    WrapInFunction(Call(ty.array(ty.vec3<f32>(), 3_u), vec3<f32>(1_f, 2_f, 3_f),
-                        vec3<f32>(4_f, 5_f, 6_f), vec3<f32>(7_f, 8_f, 9_f)));
+    WrapInFunction(Call<array<vec3<f32>, 3>>(Call<vec3<f32>>(1_f, 2_f, 3_f),
+                                             Call<vec3<f32>>(4_f, 5_f, 6_f),
+                                             Call<vec3<f32>>(7_f, 8_f, 9_f)));
 
     GeneratorImpl& gen = Build();
 
@@ -393,7 +395,7 @@
                                    Member("c", ty.vec3<i32>()),
                                });
 
-    WrapInFunction(Call(ty.Of(str), 1_i, 2_f, vec3<i32>(3_i, 4_i, 5_i)));
+    WrapInFunction(Call(ty.Of(str), 1_i, 2_f, Call<vec3<i32>>(3_i, 4_i, 5_i)));
 
     GeneratorImpl& gen = Build();
 
diff --git a/src/tint/writer/msl/generator_impl_function_test.cc b/src/tint/writer/msl/generator_impl_function_test.cc
index b828574..1fbffe2 100644
--- a/src/tint/writer/msl/generator_impl_function_test.cc
+++ b/src/tint/writer/msl/generator_impl_function_test.cc
@@ -16,7 +16,8 @@
 #include "src/tint/ast/variable_decl_statement.h"
 #include "src/tint/writer/msl/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::msl {
 namespace {
@@ -194,7 +195,7 @@
         });
 
     Func("vert_main", utils::Empty, ty.Of(interface_struct),
-         utils::Vector{Return(Call(ty.Of(interface_struct), 0.5_f, 0.25_f, vec4<f32>()))},
+         utils::Vector{Return(Call(ty.Of(interface_struct), 0.5_f, 0.25_f, Call<vec4<f32>>()))},
          utils::Vector{Stage(ast::PipelineStage::kVertex)});
 
     Func("frag_main", utils::Vector{Param("colors", ty.Of(interface_struct))}, ty.void_(),
@@ -276,8 +277,7 @@
 
     Func("foo", utils::Vector{Param("x", ty.f32())}, ty.Of(vertex_output_struct),
          utils::Vector{
-             Return(
-                 Call(ty.Of(vertex_output_struct), Call(ty.vec4<f32>(), "x", "x", "x", Expr(1_f)))),
+             Return(Call(ty.Of(vertex_output_struct), Call<vec4<f32>>("x", "x", "x", 1_f))),
          });
     Func("vert_main1", utils::Empty, ty.Of(vertex_output_struct),
          utils::Vector{Return(Expr(Call("foo", Expr(0.5_f))))},
diff --git a/src/tint/writer/msl/generator_impl_import_test.cc b/src/tint/writer/msl/generator_impl_import_test.cc
index d221665..bab2b71 100644
--- a/src/tint/writer/msl/generator_impl_import_test.cc
+++ b/src/tint/writer/msl/generator_impl_import_test.cc
@@ -16,7 +16,8 @@
 #include "src/tint/utils/string_stream.h"
 #include "src/tint/writer/msl/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::msl {
 namespace {
@@ -134,7 +135,7 @@
 TEST_P(MslImportData_DualParam_VectorTest, Float) {
     auto param = GetParam();
 
-    auto* expr = Call(param.name, vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(4_f, 5_f, 6_f));
+    auto* expr = Call(param.name, Call<vec3<f32>>(1_f, 2_f, 3_f), Call<vec3<f32>>(4_f, 5_f, 6_f));
     WrapInFunction(expr);
 
     GeneratorImpl& gen = Build();
@@ -196,8 +197,8 @@
 TEST_P(MslImportData_TripleParam_VectorTest, Float) {
     auto param = GetParam();
 
-    auto* expr = Call(param.name, vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(4_f, 5_f, 6_f),
-                      vec3<f32>(7_f, 8_f, 9_f));
+    auto* expr = Call(param.name, Call<vec3<f32>>(1_f, 2_f, 3_f), Call<vec3<f32>>(4_f, 5_f, 6_f),
+                      Call<vec3<f32>>(7_f, 8_f, 9_f));
     WrapInFunction(expr);
 
     GeneratorImpl& gen = Build();
@@ -262,7 +263,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, MslImportData_QuantizeToF16_Vector) {
-    GlobalVar("v", vec3<f32>(2_f), builtin::AddressSpace::kPrivate);
+    GlobalVar("v", Call<vec3<f32>>(2_f), builtin::AddressSpace::kPrivate);
 
     auto* expr = Call("quantizeToF16", "v");
     WrapInFunction(expr);
diff --git a/src/tint/writer/msl/generator_impl_module_constant_test.cc b/src/tint/writer/msl/generator_impl_module_constant_test.cc
index 4d977b0..e3b8f86 100644
--- a/src/tint/writer/msl/generator_impl_module_constant_test.cc
+++ b/src/tint/writer/msl/generator_impl_module_constant_test.cc
@@ -15,7 +15,8 @@
 #include "src/tint/ast/id_attribute.h"
 #include "src/tint/writer/msl/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::msl {
 namespace {
@@ -133,7 +134,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_GlobalConst_vec3_AInt) {
-    auto* var = GlobalConst("G", Call(ty.vec3<Infer>(), 1_a, 2_a, 3_a));
+    auto* var = GlobalConst("G", Call<vec3<Infer>>(1_a, 2_a, 3_a));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
@@ -151,7 +152,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_GlobalConst_vec3_AFloat) {
-    auto* var = GlobalConst("G", Call(ty.vec3<Infer>(), 1._a, 2._a, 3._a));
+    auto* var = GlobalConst("G", Call<vec3<Infer>>(1._a, 2._a, 3._a));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
@@ -169,7 +170,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_GlobalConst_vec3_f32) {
-    auto* var = GlobalConst("G", vec3<f32>(1_f, 2_f, 3_f));
+    auto* var = GlobalConst("G", Call<vec3<f32>>(1_f, 2_f, 3_f));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
@@ -189,7 +190,7 @@
 TEST_F(MslGeneratorImplTest, Emit_GlobalConst_vec3_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = GlobalConst("G", vec3<f16>(1_h, 2_h, 3_h));
+    auto* var = GlobalConst("G", Call<vec3<f16>>(1_h, 2_h, 3_h));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
@@ -207,7 +208,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_GlobalConst_mat2x3_AFloat) {
-    auto* var = GlobalConst("G", Call(ty.mat2x3<Infer>(), 1._a, 2._a, 3._a, 4._a, 5._a, 6._a));
+    auto* var = GlobalConst("G", Call<mat2x3<Infer>>(1._a, 2._a, 3._a, 4._a, 5._a, 6._a));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
@@ -225,7 +226,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_GlobalConst_mat2x3_f32) {
-    auto* var = GlobalConst("G", mat2x3<f32>(1_f, 2_f, 3_f, 4_f, 5_f, 6_f));
+    auto* var = GlobalConst("G", Call<mat2x3<f32>>(1_f, 2_f, 3_f, 4_f, 5_f, 6_f));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
@@ -245,7 +246,7 @@
 TEST_F(MslGeneratorImplTest, Emit_GlobalConst_mat2x3_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = GlobalConst("G", mat2x3<f16>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
+    auto* var = GlobalConst("G", Call<mat2x3<f16>>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
@@ -294,10 +295,9 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_GlobalConst_arr_vec2_bool) {
-    auto* var = GlobalConst("G", Call(ty.array(ty.vec2<bool>(), 3_u),  //
-                                      vec2<bool>(true, false),         //
-                                      vec2<bool>(false, true),         //
-                                      vec2<bool>(true, true)));
+    auto* var = GlobalConst("G", Call<array<vec2<bool>, 3>>(Call<vec2<bool>>(true, false),  //
+                                                            Call<vec2<bool>>(false, true),  //
+                                                            Call<vec2<bool>>(true, true)));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(Let("l", Expr(var)))});
 
     GeneratorImpl& gen = Build();
diff --git a/src/tint/writer/msl/generator_impl_type_test.cc b/src/tint/writer/msl/generator_impl_type_test.cc
index 52d02ee..05109c0 100644
--- a/src/tint/writer/msl/generator_impl_type_test.cc
+++ b/src/tint/writer/msl/generator_impl_type_test.cc
@@ -26,13 +26,13 @@
 #include "src/tint/utils/string_stream.h"
 #include "src/tint/writer/msl/test_helper.h"
 
-using ::testing::HasSubstr;
-
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::writer::msl {
 namespace {
 
+using ::testing::HasSubstr;
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 void FormatMSLField(utils::StringStream& out,
                     const char* addr,
                     const char* type,
@@ -562,7 +562,7 @@
 
 TEST_F(MslGeneratorImplTest, EmitType_Struct_Layout_ArrayVec3DefaultStride) {
     // array: size(64), align(16)
-    auto array = ty.array(ty.vec3<f32>(), 4_u);
+    auto array = ty.array<vec3<f32>, 4>();
 
     auto* s = Structure("S", utils::Vector{
                                  Member("a", ty.i32()),
diff --git a/src/tint/writer/msl/generator_impl_variable_decl_statement_test.cc b/src/tint/writer/msl/generator_impl_variable_decl_statement_test.cc
index 3660be5..be9fe72 100644
--- a/src/tint/writer/msl/generator_impl_variable_decl_statement_test.cc
+++ b/src/tint/writer/msl/generator_impl_variable_decl_statement_test.cc
@@ -16,12 +16,12 @@
 #include "src/tint/ast/variable_decl_statement.h"
 #include "src/tint/writer/msl/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::writer::msl {
 namespace {
 
 using ::testing::HasSubstr;
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 using MslGeneratorImplTest = TestHelper;
 
@@ -175,7 +175,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Const_vec3_AInt) {
-    auto* C = Const("C", vec3<Infer>(1_a, 2_a, 3_a));
+    auto* C = Const("C", Call<vec3<Infer>>(1_a, 2_a, 3_a));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(C), Decl(Let("l", Expr(C)))});
 
     GeneratorImpl& gen = Build();
@@ -193,7 +193,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Const_vec3_AFloat) {
-    auto* C = Const("C", vec3<Infer>(1._a, 2._a, 3._a));
+    auto* C = Const("C", Call<vec3<Infer>>(1._a, 2._a, 3._a));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(C), Decl(Let("l", Expr(C)))});
 
     GeneratorImpl& gen = Build();
@@ -211,7 +211,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Const_vec3_f32) {
-    auto* C = Const("C", vec3<f32>(1_f, 2_f, 3_f));
+    auto* C = Const("C", Call<vec3<f32>>(1_f, 2_f, 3_f));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(C), Decl(Let("l", Expr(C)))});
 
     GeneratorImpl& gen = Build();
@@ -231,7 +231,7 @@
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Const_vec3_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* C = Const("C", vec3<f16>(1_h, 2_h, 3_h));
+    auto* C = Const("C", Call<vec3<f16>>(1_h, 2_h, 3_h));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(C), Decl(Let("l", Expr(C)))});
 
     GeneratorImpl& gen = Build();
@@ -249,7 +249,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Const_mat2x3_AFloat) {
-    auto* C = Const("C", Call(ty.mat2x3<Infer>(), 1._a, 2._a, 3._a, 4._a, 5._a, 6._a));
+    auto* C = Const("C", Call<mat2x3<Infer>>(1._a, 2._a, 3._a, 4._a, 5._a, 6._a));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(C), Decl(Let("l", Expr(C)))});
 
     GeneratorImpl& gen = Build();
@@ -267,7 +267,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Const_mat2x3_f32) {
-    auto* C = Const("C", mat2x3<f32>(1_f, 2_f, 3_f, 4_f, 5_f, 6_f));
+    auto* C = Const("C", Call<mat2x3<f32>>(1_f, 2_f, 3_f, 4_f, 5_f, 6_f));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(C), Decl(Let("l", Expr(C)))});
 
     GeneratorImpl& gen = Build();
@@ -287,7 +287,7 @@
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Const_mat2x3_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* C = Const("C", mat2x3<f16>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
+    auto* C = Const("C", Call<mat2x3<f16>>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(C), Decl(Let("l", Expr(C)))});
 
     GeneratorImpl& gen = Build();
@@ -305,7 +305,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Const_arr_f32) {
-    auto* C = Const("C", array<f32, 3>(1_f, 2_f, 3_f));
+    auto* C = Const("C", Call<array<f32, 3>>(1_f, 2_f, 3_f));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(C), Decl(Let("l", Expr(C)))});
 
     GeneratorImpl& gen = Build();
@@ -336,10 +336,10 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Const_arr_vec2_bool) {
-    auto* C = Const("C", Call(ty.array(ty.vec2<bool>(), 3_u),  //
-                              vec2<bool>(true, false),         //
-                              vec2<bool>(false, true),         //
-                              vec2<bool>(true, true)));
+    auto* C = Const("C", Call<array<vec2<bool>, 3>>(         //
+                             Call<vec2<bool>>(true, false),  //
+                             Call<vec2<bool>>(false, true),  //
+                             Call<vec2<bool>>(true, true)));
     Func("f", utils::Empty, ty.void_(), utils::Vector{Decl(C), Decl(Let("l", Expr(C)))});
 
     GeneratorImpl& gen = Build();
@@ -460,7 +460,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Initializer_ZeroVec_f32) {
-    auto* var = Var("a", ty.vec3<f32>(), vec3<f32>());
+    auto* var = Var("a", ty.vec3<f32>(), Call<vec3<f32>>());
 
     auto* stmt = Decl(var);
     WrapInFunction(stmt);
@@ -475,7 +475,7 @@
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Initializer_ZeroVec_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Var("a", ty.vec3<f16>(), vec3<f16>());
+    auto* var = Var("a", ty.vec3<f16>(), Call<vec3<f16>>());
 
     auto* stmt = Decl(var);
     WrapInFunction(stmt);
@@ -488,7 +488,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Initializer_ZeroMat_f32) {
-    auto* var = Var("a", ty.mat2x3<f32>(), mat2x3<f32>());
+    auto* var = Var("a", ty.mat2x3<f32>(), Call<mat2x3<f32>>());
 
     auto* stmt = Decl(var);
     WrapInFunction(stmt);
@@ -504,7 +504,7 @@
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Initializer_ZeroMat_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Var("a", ty.mat2x3<f16>(), mat2x3<f16>());
+    auto* var = Var("a", ty.mat2x3<f16>(), Call<mat2x3<f16>>());
 
     auto* stmt = Decl(var);
     WrapInFunction(stmt);
diff --git a/src/tint/writer/spirv/builder_accessor_expression_test.cc b/src/tint/writer/spirv/builder_accessor_expression_test.cc
index d93b414..e14a79a 100644
--- a/src/tint/writer/spirv/builder_accessor_expression_test.cc
+++ b/src/tint/writer/spirv/builder_accessor_expression_test.cc
@@ -15,7 +15,8 @@
 #include "src/tint/writer/spirv/spv_dump.h"
 #include "src/tint/writer/spirv/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::spirv {
 namespace {
@@ -26,7 +27,7 @@
     // let ary = vec3<i32>(1, 2, 3);
     // var x = ary[1i];
 
-    auto* ary = Let("ary", vec3<i32>(1_i, 2_i, 3_i));
+    auto* ary = Let("ary", Call<vec3<i32>>(1_i, 2_i, 3_i));
     auto* x = Var("x", IndexAccessor(ary, 1_i));
     WrapInFunction(ary, x);
 
@@ -61,7 +62,7 @@
     // const ary = vec3<i32>(1, 2, 3);
     // var x = ary[1i];
 
-    auto* ary = Const("ary", vec3<i32>(1_i, 2_i, 3_i));
+    auto* ary = Const("ary", Call<vec3<i32>>(1_i, 2_i, 3_i));
     auto* x = Var("x", IndexAccessor(ary, 1_i));
     WrapInFunction(ary, x);
 
@@ -169,7 +170,7 @@
     // let ary : vec3<i32>(1, 2, 3);
     // var x = ary[1i + 1i];
 
-    auto* ary = Let("ary", vec3<i32>(1_i, 2_i, 3_i));
+    auto* ary = Let("ary", Call<vec3<i32>>(1_i, 2_i, 3_i));
     auto* x = Var("x", IndexAccessor(ary, Add(1_i, 1_i)));
     WrapInFunction(ary, x);
 
@@ -286,8 +287,8 @@
     // let ary = array<vec3<f32>, 2u>(vec3<f32>(1.0f, 2.0f, 3.0f), vec3<f32>(4.0f, 5.0f, 6.0f));
     // var x = ary[1i][2i];
 
-    auto* ary = Let("ary", array(ty.vec3<f32>(), 2_u, vec3<f32>(1._f, 2._f, 3._f),
-                                 vec3<f32>(4._f, 5._f, 6._f)));
+    auto* ary = Let("ary", Call<array<vec3<f32>, 2>>(Call<vec3<f32>>(1._f, 2._f, 3._f),
+                                                     Call<vec3<f32>>(4._f, 5._f, 6._f)));
     auto* x = Var("x", IndexAccessor(IndexAccessor(ary, 1_i), 2_i));
     WrapInFunction(ary, x);
 
@@ -334,8 +335,8 @@
     // const ary = array<vec3<f32>, 2u>(vec3<f32>(1.0f, 2.0f, 3.0f), vec3<f32>(4.0f, 5.0f, 6.0f));
     // var x = ary[1i][2i];
 
-    auto* ary = Const("ary", array(ty.vec3<f32>(), 2_u, vec3<f32>(1._f, 2._f, 3._f),
-                                   vec3<f32>(4._f, 5._f, 6._f)));
+    auto* ary = Const("ary", Call<array<vec3<f32>, 2>>(Call<vec3<f32>>(1._f, 2._f, 3._f),
+                                                       Call<vec3<f32>>(4._f, 5._f, 6._f)));
     auto* x = Var("x", IndexAccessor(IndexAccessor(ary, 1_i), 2_i));
     WrapInFunction(ary, x);
 
@@ -365,7 +366,7 @@
     // var ary : array<vec3<f32>, 4u>;
     // var x = ary[1i][2i];
 
-    auto* ary = Var("ary", ty.array(ty.vec3<f32>(), 4_u));
+    auto* ary = Var("ary", ty.array<vec3<f32>, 4>());
     auto* x = Var("x", IndexAccessor(IndexAccessor(ary, 1_i), 2_i));
     WrapInFunction(ary, x);
 
@@ -407,7 +408,7 @@
     // var one = 1i;
     // var x = ary[one][2i];
 
-    auto* ary = Var("ary", ty.array(ty.vec3<f32>(), 4_u));
+    auto* ary = Var("ary", ty.array<vec3<f32>, 4>());
     auto* one = Var("one", Expr(3_i));
     auto* x = Var("x", IndexAccessor(IndexAccessor(ary, one), 2_i));
     WrapInFunction(ary, one, x);
@@ -453,8 +454,8 @@
     // let ary = array<vec3<f32>, 2u>(vec3<f32>(1.0f, 2.0f, 3.0f), vec3<f32>(4.0f, 5.0f, 6.0f));
     // var x = a[1i].xy;
 
-    auto* ary = Let("ary", array(ty.vec3<f32>(), 2_u, vec3<f32>(1._f, 2._f, 3._f),
-                                 vec3<f32>(4._f, 5._f, 6._f)));
+    auto* ary = Let("ary", Call<array<vec3<f32>, 2>>(Call<vec3<f32>>(1._f, 2._f, 3._f),
+                                                     Call<vec3<f32>>(4._f, 5._f, 6._f)));
     auto* x = Var("x", MemberAccessor(IndexAccessor("ary", 1_i), "xy"));
     WrapInFunction(ary, x);
 
@@ -501,7 +502,7 @@
     // var ary : array<vec3<f32>, 4u>;
     // var x = ary[1i].xy;
 
-    auto* ary = Var("ary", ty.array(ty.vec3<f32>(), 4_u));
+    auto* ary = Var("ary", ty.array<vec3<f32>, 4>());
     auto* x = Var("x", MemberAccessor(IndexAccessor("ary", 1_i), "xy"));
     WrapInFunction(ary, x);
 
@@ -545,7 +546,7 @@
     // var one = 1i;
     // var x = ary[one].xy;
 
-    auto* ary = Var("ary", ty.array(ty.vec3<f32>(), 4_u));
+    auto* ary = Var("ary", ty.array<vec3<f32>, 4>());
     auto* one = Var("one", Expr(1_i));
     auto* x = Var("x", MemberAccessor(IndexAccessor("ary", one), "xy"));
     WrapInFunction(ary, one, x);
@@ -596,9 +597,10 @@
     //   array<f32, 2>(0.5, -0.5));
     // var x = pos[1u][0u];
 
-    auto* pos = Let("pos", ty.array(ty.vec2<f32>(), 3_u),
-                    Call(ty.array(ty.vec2<f32>(), 3_u), vec2<f32>(0_f, 0.5_f),
-                         vec2<f32>(-0.5_f, -0.5_f), vec2<f32>(0.5_f, -0.5_f)));
+    auto* pos =
+        Let("pos", ty.array<vec2<f32>, 3>(),
+            Call<array<vec2<f32>, 3>>(Call<vec2<f32>>(0_f, 0.5_f), Call<vec2<f32>>(-0.5_f, -0.5_f),
+                                      Call<vec2<f32>>(0.5_f, -0.5_f)));
     auto* x = Var("x", IndexAccessor(IndexAccessor(pos, 1_u), 0_u));
     WrapInFunction(pos, x);
 
@@ -644,9 +646,10 @@
     //   array<f32, 2>(0.5, -0.5));
     // var x = pos[1u][0u];
 
-    auto* pos = Const("pos", ty.array(ty.vec2<f32>(), 3_u),
-                      Call(ty.array(ty.vec2<f32>(), 3_u), vec2<f32>(0_f, 0.5_f),
-                           vec2<f32>(-0.5_f, -0.5_f), vec2<f32>(0.5_f, -0.5_f)));
+    auto* pos = Const(
+        "pos", ty.array<vec2<f32>, 3>(),
+        Call<array<vec2<f32>, 3>>(Call<vec2<f32>>(0_f, 0.5_f), Call<vec2<f32>>(-0.5_f, -0.5_f),
+                                  Call<vec2<f32>>(0.5_f, -0.5_f)));
     auto* x = Var("x", IndexAccessor(IndexAccessor(pos, 1_u), 0_u));
     WrapInFunction(pos, x);
 
@@ -676,7 +679,7 @@
     // var pos : array<vec3<f32>, 3u>;
     // var x = pos[1u][2u];
 
-    auto* pos = Var("pos", ty.array(ty.vec3<f32>(), 3_a));
+    auto* pos = Var("pos", ty.array<vec3<f32>, 3>());
     auto* x = Var("x", IndexAccessor(IndexAccessor(pos, 1_u), 2_u));
     WrapInFunction(pos, x);
 
@@ -762,9 +765,10 @@
     // let a : mat2x2<f32>(vec2<f32>(1., 2.), vec2<f32>(3., 4.));
     // var x = a[1i]
 
-    auto* a =
-        Let("a", ty.mat2x2<f32>(),
-            Call(ty.mat2x2<f32>(), Call(ty.vec2<f32>(), 1_f, 2_f), Call(ty.vec2<f32>(), 3_f, 4_f)));
+    auto* a = Let("a", ty.mat2x2<f32>(),
+                  Call<mat2x2<f32>>(              //
+                      Call<vec2<f32>>(1_f, 2_f),  //
+                      Call<vec2<f32>>(3_f, 4_f)));
     auto* x = Var("x", IndexAccessor("a", 1_i));
     WrapInFunction(a, x);
 
@@ -805,9 +809,10 @@
     // const a : mat2x2<f32>(vec2<f32>(1., 2.), vec2<f32>(3., 4.));
     // var x = a[1i]
 
-    auto* a = Const(
-        "a", ty.mat2x2<f32>(),
-        Call(ty.mat2x2<f32>(), Call(ty.vec2<f32>(), 1_f, 2_f), Call(ty.vec2<f32>(), 3_f, 4_f)));
+    auto* a = Const("a", ty.mat2x2<f32>(),
+                    Call<mat2x2<f32>>(              //
+                        Call<vec2<f32>>(1_f, 2_f),  //
+                        Call<vec2<f32>>(3_f, 4_f)));
     auto* x = Var("x", IndexAccessor("a", 1_i));
     WrapInFunction(a, x);
 
diff --git a/src/tint/writer/spirv/builder_assign_test.cc b/src/tint/writer/spirv/builder_assign_test.cc
index e37563a..11ae7940 100644
--- a/src/tint/writer/spirv/builder_assign_test.cc
+++ b/src/tint/writer/spirv/builder_assign_test.cc
@@ -17,7 +17,8 @@
 #include "src/tint/writer/spirv/spv_dump.h"
 #include "src/tint/writer/spirv/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::spirv {
 namespace {
@@ -75,7 +76,7 @@
 TEST_F(BuilderTest, Assign_Var_ZeroInitializer) {
     auto* v = GlobalVar("var", ty.vec3<f32>(), builtin::AddressSpace::kPrivate);
 
-    auto* val = vec3<f32>();
+    auto* val = Call<vec3<f32>>();
     auto* assign = Assign("var", val);
 
     WrapInFunction(assign);
@@ -102,7 +103,7 @@
 }
 
 TEST_F(BuilderTest, Assign_Var_Complex_InitializerNestedVector) {
-    auto* init = vec3<f32>(vec2<f32>(1_f, 2_f), 3_f);
+    auto* init = Call<vec3<f32>>(Call<vec2<f32>>(1_f, 2_f), 3_f);
 
     auto* v = GlobalVar("var", ty.vec3<f32>(), builtin::AddressSpace::kPrivate);
 
@@ -135,7 +136,7 @@
 }
 
 TEST_F(BuilderTest, Assign_Var_Complex_Initializer) {
-    auto* init = vec3<f32>(1_f, 2_f, 3_f);
+    auto* init = Call<vec3<f32>>(1_f, 2_f, 3_f);
 
     auto* v = GlobalVar("var", ty.vec3<f32>(), builtin::AddressSpace::kPrivate);
 
@@ -214,7 +215,7 @@
 TEST_F(BuilderTest, Assign_Vector) {
     auto* v = GlobalVar("var", ty.vec3<f32>(), builtin::AddressSpace::kPrivate);
 
-    auto* val = vec3<f32>(1_f, 1_f, 3_f);
+    auto* val = Call<vec3<f32>>(1_f, 1_f, 3_f);
     auto* assign = Assign("var", val);
 
     WrapInFunction(assign);
diff --git a/src/tint/writer/spirv/builder_binary_expression_test.cc b/src/tint/writer/spirv/builder_binary_expression_test.cc
index 36bd427..0a4c963 100644
--- a/src/tint/writer/spirv/builder_binary_expression_test.cc
+++ b/src/tint/writer/spirv/builder_binary_expression_test.cc
@@ -15,7 +15,8 @@
 #include "src/tint/writer/spirv/spv_dump.h"
 #include "src/tint/writer/spirv/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::spirv {
 namespace {
@@ -66,8 +67,8 @@
         return;
     }
 
-    auto* lhs = vec3<i32>(1_i, 1_i, 1_i);
-    auto* rhs = vec3<i32>(1_i, 1_i, 1_i);
+    auto* lhs = Call<vec3<i32>>(1_i, 1_i, 1_i);
+    auto* rhs = Call<vec3<i32>>(1_i, 1_i, 1_i);
 
     auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
@@ -159,8 +160,8 @@
         return;
     }
 
-    auto* lhs = vec3<u32>(1_u, 1_u, 1_u);
-    auto* rhs = vec3<u32>(1_u, 1_u, 1_u);
+    auto* lhs = Call<vec3<u32>>(1_u, 1_u, 1_u);
+    auto* rhs = Call<vec3<u32>>(1_u, 1_u, 1_u);
 
     auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
@@ -220,8 +221,8 @@
 TEST_P(BinaryArithF32Test, Vector) {
     auto param = GetParam();
 
-    auto* lhs = vec3<f32>(1_f, 1_f, 1_f);
-    auto* rhs = vec3<f32>(1_f, 1_f, 1_f);
+    auto* lhs = Call<vec3<f32>>(1_f, 1_f, 1_f);
+    auto* rhs = Call<vec3<f32>>(1_f, 1_f, 1_f);
 
     auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
@@ -279,8 +280,8 @@
 
     auto param = GetParam();
 
-    auto* lhs = vec3<f16>(1_h, 1_h, 1_h);
-    auto* rhs = vec3<f16>(1_h, 1_h, 1_h);
+    auto* lhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
+    auto* rhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
 
     auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
@@ -334,8 +335,8 @@
 TEST_P(BinaryOperatorBoolTest, Vector) {
     auto param = GetParam();
 
-    auto* lhs = vec3<bool>(false, true, false);
-    auto* rhs = vec3<bool>(true, false, true);
+    auto* lhs = Call<vec3<bool>>(false, true, false);
+    auto* rhs = Call<vec3<bool>>(true, false, true);
 
     auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
@@ -391,8 +392,8 @@
 TEST_P(BinaryCompareUnsignedIntegerTest, Vector) {
     auto param = GetParam();
 
-    auto* lhs = vec3<u32>(1_u, 1_u, 1_u);
-    auto* rhs = vec3<u32>(1_u, 1_u, 1_u);
+    auto* lhs = Call<vec3<u32>>(1_u, 1_u, 1_u);
+    auto* rhs = Call<vec3<u32>>(1_u, 1_u, 1_u);
 
     auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
@@ -451,8 +452,8 @@
 TEST_P(BinaryCompareSignedIntegerTest, Vector) {
     auto param = GetParam();
 
-    auto* lhs = vec3<i32>(1_i, 1_i, 1_i);
-    auto* rhs = vec3<i32>(1_i, 1_i, 1_i);
+    auto* lhs = Call<vec3<i32>>(1_i, 1_i, 1_i);
+    auto* rhs = Call<vec3<i32>>(1_i, 1_i, 1_i);
 
     auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
@@ -511,8 +512,8 @@
 TEST_P(BinaryCompareF32Test, Vector) {
     auto param = GetParam();
 
-    auto* lhs = vec3<f32>(1_f, 1_f, 1_f);
-    auto* rhs = vec3<f32>(1_f, 1_f, 1_f);
+    auto* lhs = Call<vec3<f32>>(1_f, 1_f, 1_f);
+    auto* rhs = Call<vec3<f32>>(1_f, 1_f, 1_f);
 
     auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
@@ -575,8 +576,8 @@
 
     auto param = GetParam();
 
-    auto* lhs = vec3<f16>(1_h, 1_h, 1_h);
-    auto* rhs = vec3<f16>(1_h, 1_h, 1_h);
+    auto* lhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
+    auto* rhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
 
     auto* expr = create<ast::BinaryExpression>(param.op, lhs, rhs);
 
@@ -608,7 +609,7 @@
                     BinaryData{ast::BinaryOp::kNotEqual, "OpFOrdNotEqual"}));
 
 TEST_F(BuilderTest, Binary_Multiply_VectorScalar_F32) {
-    auto* lhs = vec3<f32>(1_f, 1_f, 1_f);
+    auto* lhs = Call<vec3<f32>>(1_f, 1_f, 1_f);
     auto* rhs = Expr(1_f);
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
@@ -633,7 +634,7 @@
 TEST_F(BuilderTest, Binary_Multiply_VectorScalar_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* lhs = vec3<f16>(1_h, 1_h, 1_h);
+    auto* lhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
     auto* rhs = Expr(1_h);
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
@@ -657,7 +658,7 @@
 
 TEST_F(BuilderTest, Binary_Multiply_ScalarVector_F32) {
     auto* lhs = Expr(1_f);
-    auto* rhs = vec3<f32>(1_f, 1_f, 1_f);
+    auto* rhs = Call<vec3<f32>>(1_f, 1_f, 1_f);
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
 
@@ -682,7 +683,7 @@
     Enable(builtin::Extension::kF16);
 
     auto* lhs = Expr(1_h);
-    auto* rhs = vec3<f16>(1_h, 1_h, 1_h);
+    auto* rhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, rhs);
 
@@ -813,7 +814,7 @@
 
 TEST_F(BuilderTest, Binary_Multiply_MatrixVector_F32) {
     auto* var = Var("mat", ty.mat3x3<f32>());
-    auto* rhs = vec3<f32>(1_f, 1_f, 1_f);
+    auto* rhs = Call<vec3<f32>>(1_f, 1_f, 1_f);
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, Expr("mat"), rhs);
 
     WrapInFunction(var, expr);
@@ -843,7 +844,7 @@
     Enable(builtin::Extension::kF16);
 
     auto* var = Var("mat", ty.mat3x3<f16>());
-    auto* rhs = vec3<f16>(1_h, 1_h, 1_h);
+    auto* rhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, Expr("mat"), rhs);
 
     WrapInFunction(var, expr);
@@ -871,7 +872,7 @@
 
 TEST_F(BuilderTest, Binary_Multiply_VectorMatrix_F32) {
     auto* var = Var("mat", ty.mat3x3<f32>());
-    auto* lhs = vec3<f32>(1_f, 1_f, 1_f);
+    auto* lhs = Call<vec3<f32>>(1_f, 1_f, 1_f);
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, Expr("mat"));
 
     WrapInFunction(var, expr);
@@ -901,7 +902,7 @@
     Enable(builtin::Extension::kF16);
 
     auto* var = Var("mat", ty.mat3x3<f16>());
-    auto* lhs = vec3<f16>(1_h, 1_h, 1_h);
+    auto* lhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
 
     auto* expr = create<ast::BinaryExpression>(ast::BinaryOp::kMultiply, lhs, Expr("mat"));
 
@@ -1252,19 +1253,23 @@
     auto name = builder->Symbols().New();
     switch (type) {
         case Type::f32:
-            builder->GlobalVar(name, builder->ty.vec3<f32>(), builder->vec3<f32>(1_f, 1_f, 1_f),
+            builder->GlobalVar(name, builder->ty.vec3<f32>(),
+                               builder->Call<vec3<f32>>(1_f, 1_f, 1_f),
                                builtin::AddressSpace::kPrivate);
             break;
         case Type::f16:
-            builder->GlobalVar(name, builder->ty.vec3<f16>(), builder->vec3<f16>(1_h, 1_h, 1_h),
+            builder->GlobalVar(name, builder->ty.vec3<f16>(),
+                               builder->Call<vec3<f16>>(1_h, 1_h, 1_h),
                                builtin::AddressSpace::kPrivate);
             break;
         case Type::i32:
-            builder->GlobalVar(name, builder->ty.vec3<i32>(), builder->vec3<i32>(1_i, 1_i, 1_i),
+            builder->GlobalVar(name, builder->ty.vec3<i32>(),
+                               builder->Call<vec3<i32>>(1_i, 1_i, 1_i),
                                builtin::AddressSpace::kPrivate);
             break;
         case Type::u32:
-            builder->GlobalVar(name, builder->ty.vec3<u32>(), builder->vec3<u32>(1_u, 1_u, 1_u),
+            builder->GlobalVar(name, builder->ty.vec3<u32>(),
+                               builder->Call<vec3<u32>>(1_u, 1_u, 1_u),
                                builtin::AddressSpace::kPrivate);
             break;
     }
@@ -1581,11 +1586,11 @@
     auto name = builder->Symbols().New();
     switch (type) {
         case Type::f32:
-            builder->GlobalVar(name, builder->ty.mat3x4<f32>(), builder->mat3x4<f32>(),
+            builder->GlobalVar(name, builder->ty.mat3x4<f32>(), builder->Call<mat3x4<f32>>(),
                                builtin::AddressSpace::kPrivate);
             break;
         case Type::f16:
-            builder->GlobalVar(name, builder->ty.mat3x4<f16>(), builder->mat3x4<f16>(),
+            builder->GlobalVar(name, builder->ty.mat3x4<f16>(), builder->Call<mat3x4<f16>>(),
                                builtin::AddressSpace::kPrivate);
             break;
     }
@@ -1595,11 +1600,11 @@
     auto name = builder->Symbols().New();
     switch (type) {
         case Type::f32:
-            builder->GlobalVar(name, builder->ty.mat4x3<f32>(), builder->mat4x3<f32>(),
+            builder->GlobalVar(name, builder->ty.mat4x3<f32>(), builder->Call<mat4x3<f32>>(),
                                builtin::AddressSpace::kPrivate);
             break;
         case Type::f16:
-            builder->GlobalVar(name, builder->ty.mat4x3<f16>(), builder->mat4x3<f16>(),
+            builder->GlobalVar(name, builder->ty.mat4x3<f16>(), builder->Call<mat4x3<f16>>(),
                                builtin::AddressSpace::kPrivate);
     }
     return builder->Expr(name);
diff --git a/src/tint/writer/spirv/builder_builtin_test.cc b/src/tint/writer/spirv/builder_builtin_test.cc
index ba33a44..a60dfd2 100644
--- a/src/tint/writer/spirv/builder_builtin_test.cc
+++ b/src/tint/writer/spirv/builder_builtin_test.cc
@@ -20,7 +20,8 @@
 #include "src/tint/writer/spirv/spv_dump.h"
 #include "src/tint/writer/spirv/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::spirv {
 namespace {
@@ -47,8 +48,10 @@
     auto* tex = GlobalVar("texture", t, Binding(0_a), Group(0_a));
     auto* sampler = GlobalVar("sampler", s, Binding(1_a), Group(0_a));
 
-    auto* expr1 = Call("textureSampleCompare", "texture", "sampler", vec2<f32>(1_f, 2_f), 2_f);
-    auto* expr2 = Call("textureSampleCompare", "texture", "sampler", vec2<f32>(1_f, 2_f), 2_f);
+    auto* expr1 =
+        Call("textureSampleCompare", "texture", "sampler", Call<vec2<f32>>(1_f, 2_f), 2_f);
+    auto* expr2 =
+        Call("textureSampleCompare", "texture", "sampler", Call<vec2<f32>>(1_f, 2_f), 2_f);
 
     Func("f1", utils::Empty, ty.void_(),
          utils::Vector{
@@ -561,7 +564,7 @@
     auto param = GetParam();
 
     // Use a variable to prevent the function being evaluated as constant.
-    auto* vec = Var("a", vec2<f32>(1_f, 1_f));
+    auto* vec = Var("a", Call<vec2<f32>>(1_f, 1_f));
     auto* expr = Call(param.name, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -605,7 +608,7 @@
     auto param = GetParam();
 
     // Use a variable to prevent the function being evaluated as constant.
-    auto* vec = Var("a", vec2<f16>(1_h, 1_h));
+    auto* vec = Var("a", Call<vec2<f16>>(1_h, 1_h));
     auto* expr = Call(param.name, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -743,7 +746,7 @@
 }
 
 TEST_F(BuiltinBuilderTest, Call_Length_Vector_f32) {
-    auto* vec = Var("a", vec2<f32>(1_f, 1_f));
+    auto* vec = Var("a", Call<vec2<f32>>(1_f, 1_f));
     auto* expr = Call("length", vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -782,7 +785,7 @@
 TEST_F(BuiltinBuilderTest, Call_Length_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec = Var("a", vec2<f16>(1_h, 1_h));
+    auto* vec = Var("a", Call<vec2<f16>>(1_h, 1_h));
     auto* expr = Call("length", vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -819,7 +822,7 @@
 }
 
 TEST_F(BuiltinBuilderTest, Call_Normalize_f32) {
-    auto* vec = Var("a", vec2<f32>(1_f, 1_f));
+    auto* vec = Var("a", Call<vec2<f32>>(1_f, 1_f));
     auto* expr = Call("normalize", vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -858,7 +861,7 @@
 TEST_F(BuiltinBuilderTest, Call_Normalize_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec = Var("a", vec2<f16>(1_h, 1_h));
+    auto* vec = Var("a", Call<vec2<f16>>(1_h, 1_h));
     auto* expr = Call("normalize", vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -977,7 +980,7 @@
 
 TEST_P(Builtin_Builder_DualParam_Float_Test, Call_Vector_f32) {
     auto param = GetParam();
-    auto* vec = Var("vec", vec2<f32>(1_f, 1_f));
+    auto* vec = Var("vec", Call<vec2<f32>>(1_f, 1_f));
     auto* expr = Call(param.name, vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -1020,7 +1023,7 @@
     Enable(builtin::Extension::kF16);
 
     auto param = GetParam();
-    auto* vec = Var("vec", vec2<f16>(1_h, 1_h));
+    auto* vec = Var("vec", Call<vec2<f16>>(1_h, 1_h));
     auto* expr = Call(param.name, vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -1068,7 +1071,7 @@
                                          BuiltinData{"step", "Step"}));
 
 TEST_F(BuiltinBuilderTest, Call_Reflect_Vector_f32) {
-    auto* vec = Var("vec", vec2<f32>(1_f, 1_f));
+    auto* vec = Var("vec", Call<vec2<f32>>(1_f, 1_f));
     auto* expr = Call("reflect", vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -1108,7 +1111,7 @@
 TEST_F(BuiltinBuilderTest, Call_Reflect_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec = Var("vec", vec2<f16>(1_h, 1_h));
+    auto* vec = Var("vec", Call<vec2<f16>>(1_h, 1_h));
     auto* expr = Call("reflect", vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -1220,7 +1223,7 @@
 }
 
 TEST_F(BuiltinBuilderTest, Call_Distance_Vector_f32) {
-    auto* vec = Var("vec", vec2<f32>(1_f, 1_f));
+    auto* vec = Var("vec", Call<vec2<f32>>(1_f, 1_f));
     auto* expr = Call("distance", vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -1260,7 +1263,7 @@
 TEST_F(BuiltinBuilderTest, Call_Distance_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec = Var("vec", vec2<f16>(1_h, 1_h));
+    auto* vec = Var("vec", Call<vec2<f16>>(1_h, 1_h));
     auto* expr = Call("distance", vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -1298,7 +1301,7 @@
 }
 
 TEST_F(BuiltinBuilderTest, Call_Cross_f32) {
-    auto* vec = Var("vec", vec3<f32>(1_f, 1_f, 1_f));
+    auto* vec = Var("vec", Call<vec3<f32>>(1_f, 1_f, 1_f));
     auto* expr = Call("cross", vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -1338,7 +1341,7 @@
 TEST_F(BuiltinBuilderTest, Call_Cross_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec = Var("vec", vec3<f16>(1_h, 1_h, 1_h));
+    auto* vec = Var("vec", Call<vec3<f16>>(1_h, 1_h, 1_h));
     auto* expr = Call("cross", vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -1460,7 +1463,7 @@
 
 TEST_P(Builtin_Builder_ThreeParam_Float_Test, Call_Vector_f32) {
     auto param = GetParam();
-    auto* vec = Var("vec", vec2<f32>(1_f, 1_f));
+    auto* vec = Var("vec", Call<vec2<f32>>(1_f, 1_f));
     auto* expr = Call(param.name, vec, vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -1504,7 +1507,7 @@
     Enable(builtin::Extension::kF16);
 
     auto param = GetParam();
-    auto* vec = Var("vec", vec2<f16>(1_h, 1_h));
+    auto* vec = Var("vec", Call<vec2<f16>>(1_h, 1_h));
     auto* expr = Call(param.name, vec, vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -1553,7 +1556,7 @@
                                          BuiltinData{"smoothstep", "SmoothStep"}));
 
 TEST_F(BuiltinBuilderTest, Call_FaceForward_Vector_f32) {
-    auto* vec = Var("vec", vec2<f32>(1_f, 1_f));
+    auto* vec = Var("vec", Call<vec2<f32>>(1_f, 1_f));
     auto* expr = Call("faceForward", vec, vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -1594,7 +1597,7 @@
 TEST_F(BuiltinBuilderTest, Call_FaceForward_Vector_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec = Var("vec", vec2<f16>(1_h, 1_h));
+    auto* vec = Var("vec", Call<vec2<f16>>(1_h, 1_h));
     auto* expr = Call("faceForward", vec, vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -1633,7 +1636,7 @@
 }
 
 TEST_F(BuiltinBuilderTest, Runtime_Call_Modf_f32) {
-    auto* vec = Var("vec", vec2<f32>(1_f, 2_f));
+    auto* vec = Var("vec", Call<vec2<f32>>(1_f, 2_f));
     auto* expr = Call("modf", vec);
     Func("a_func", utils::Empty, ty.void_(),
          utils::Vector{
@@ -1687,7 +1690,7 @@
 TEST_F(BuiltinBuilderTest, Runtime_Call_Modf_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec = Var("vec", vec2<f16>(1_h, 2_h));
+    auto* vec = Var("vec", Call<vec2<f16>>(1_h, 2_h));
     auto* expr = Call("modf", vec);
     Func("a_func", utils::Empty, ty.void_(),
          utils::Vector{
@@ -1743,7 +1746,7 @@
 }
 
 TEST_F(BuiltinBuilderTest, Const_Call_Modf_f32) {
-    auto* expr = Call("modf", vec2<f32>(1_f, 2_f));
+    auto* expr = Call("modf", Call<vec2<f32>>(1_f, 2_f));
     Func("a_func", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(Let("l", expr)),
@@ -1789,7 +1792,7 @@
 TEST_F(BuiltinBuilderTest, Const_Call_Modf_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* expr = Call("modf", vec2<f16>(1_h, 2_h));
+    auto* expr = Call("modf", Call<vec2<f16>>(1_h, 2_h));
     Func("a_func", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(Let("l", expr)),
@@ -1837,7 +1840,7 @@
 }
 
 TEST_F(BuiltinBuilderTest, Runtime_Call_Frexp_f32) {
-    auto* vec = Var("vec", vec2<f32>(1_f, 2_f));
+    auto* vec = Var("vec", Call<vec2<f32>>(1_f, 2_f));
     auto* expr = Call("frexp", vec);
     Func("a_func", utils::Empty, ty.void_(),
          utils::Vector{
@@ -1893,7 +1896,7 @@
 TEST_F(BuiltinBuilderTest, Runtime_Call_Frexp_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* vec = Var("vec", vec2<f16>(1_h, 2_h));
+    auto* vec = Var("vec", Call<vec2<f16>>(1_h, 2_h));
     auto* expr = Call("frexp", vec);
     Func("a_func", utils::Empty, ty.void_(),
          utils::Vector{
@@ -1953,7 +1956,7 @@
 TEST_F(BuiltinBuilderTest, Const_Call_Frexp_f32) {
     Func("a_func", utils::Empty, ty.void_(),
          utils::Vector{
-             Decl(Let("l", Call("frexp", vec2<f32>(1_f, 2_f)))),
+             Decl(Let("l", Call("frexp", Call<vec2<f32>>(1_f, 2_f)))),
          },
          utils::Vector{
              Stage(ast::PipelineStage::kFragment),
@@ -2001,7 +2004,7 @@
 
     Func("a_func", utils::Empty, ty.void_(),
          utils::Vector{
-             Decl(Let("l", Call("frexp", vec2<f16>(1_h, 2_h)))),
+             Decl(Let("l", Call("frexp", Call<vec2<f16>>(1_h, 2_h)))),
          },
          utils::Vector{
              Stage(ast::PipelineStage::kFragment),
@@ -2088,7 +2091,7 @@
 }
 
 TEST_F(BuiltinBuilderTest, Call_QuantizeToF16_Vector) {
-    GlobalVar("v", vec3<f32>(2_f), builtin::AddressSpace::kPrivate);
+    GlobalVar("v", Call<vec3<f32>>(2_f), builtin::AddressSpace::kPrivate);
 
     Func("a_func", utils::Empty, ty.void_(),
          utils::Vector{
@@ -2320,7 +2323,7 @@
 
 TEST_P(Builtin_Builder_SingleParam_Sint_Test, Call_Vector) {
     auto param = GetParam();
-    auto* vec = Var("vec", vec2<i32>(1_i, 1_i));
+    auto* vec = Var("vec", Call<vec2<i32>>(1_i, 1_i));
     auto* expr = Call(param.name, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -2397,7 +2400,7 @@
 }
 
 TEST_F(Builtin_Builder_Abs_Uint_Test, Call_Vector) {
-    auto* scalar = Var("scalar", vec2<u32>(1_u, 1_u));
+    auto* scalar = Var("scalar", Call<vec2<u32>>(1_u, 1_u));
     auto* expr = Call("abs", scalar);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -2473,7 +2476,7 @@
 
 TEST_P(Builtin_Builder_DualParam_SInt_Test, Call_Vector) {
     auto param = GetParam();
-    auto* vec = Var("vec", vec2<i32>(1_i, 1_i));
+    auto* vec = Var("vec", Call<vec2<i32>>(1_i, 1_i));
     auto* expr = Call(param.name, vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -2557,7 +2560,7 @@
 
 TEST_P(Builtin_Builder_DualParam_UInt_Test, Call_Vector) {
     auto param = GetParam();
-    auto* vec = Var("vec", vec2<u32>(1_u, 1_u));
+    auto* vec = Var("vec", Call<vec2<u32>>(1_u, 1_u));
     auto* expr = Call(param.name, vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -2642,7 +2645,7 @@
 
 TEST_P(Builtin_Builder_ThreeParam_Sint_Test, Call_Vector) {
     auto param = GetParam();
-    auto* vec = Var("vec", vec2<i32>(1_i, 1_i));
+    auto* vec = Var("vec", Call<vec2<i32>>(1_i, 1_i));
     auto* expr = Call(param.name, vec, vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -2728,7 +2731,7 @@
 
 TEST_P(Builtin_Builder_ThreeParam_Uint_Test, Call_Vector) {
     auto param = GetParam();
-    auto* vec = Var("vec", vec2<u32>(1_u, 1_u));
+    auto* vec = Var("vec", Call<vec2<u32>>(1_u, 1_u));
     auto* expr = Call(param.name, vec, vec, vec);
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
@@ -3945,7 +3948,8 @@
     auto param = GetParam();
 
     bool pack4 = param.name == "pack4x8snorm" || param.name == "pack4x8unorm";
-    auto* call = pack4 ? Call(param.name, vec4<f32>("one")) : Call(param.name, vec2<f32>("one"));
+    auto* call =
+        pack4 ? Call(param.name, Call<vec4<f32>>("one")) : Call(param.name, Call<vec2<f32>>("one"));
     auto* func = Func("a_func", utils::Empty, ty.void_(),
                       utils::Vector{
                           Decl(Let("one", Expr(1_f))),
diff --git a/src/tint/writer/spirv/builder_constructor_expression_test.cc b/src/tint/writer/spirv/builder_constructor_expression_test.cc
index 7416bc2..ea449cb 100644
--- a/src/tint/writer/spirv/builder_constructor_expression_test.cc
+++ b/src/tint/writer/spirv/builder_constructor_expression_test.cc
@@ -15,7 +15,8 @@
 #include "src/tint/writer/spirv/spv_dump.h"
 #include "src/tint/writer/spirv/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::spirv {
 namespace {
@@ -37,7 +38,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type) {
-    auto* t = vec3<f32>(1_f, 1_f, 3_f);
+    auto* t = Call<vec3<f32>>(1_f, 1_f, 3_f);
     WrapInFunction(t);
 
     spirv::Builder& b = Build();
@@ -54,7 +55,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_WithCasts) {
-    auto* t = vec2<f32>(Call<f32>(1_i), Call<f32>(1_i));
+    auto* t = Call<vec2<f32>>(Call<f32>(1_i), Call<f32>(1_i));
     WrapInFunction(t);
 
     spirv::Builder& b = Build();
@@ -94,7 +95,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_IdentifierExpression_Param) {
     auto* var = Var("ident", ty.f32());
 
-    auto* t = vec2<f32>(1_f, "ident");
+    auto* t = Call<vec2<f32>>(1_f, "ident");
     WrapInFunction(var, t);
 
     spirv::Builder& b = Build();
@@ -122,7 +123,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Vector_Bitcast_Params) {
-    auto* var = Var("v", vec3<f32>(1_f, 2_f, 3_f));
+    auto* var = Var("v", Call<vec3<f32>>(1_f, 2_f, 3_f));
     auto* cast = Bitcast(ty.vec3<u32>(), var);
     WrapInFunction(var, cast);
 
@@ -230,7 +231,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_With_Bool_Literal) {
-    auto* cast = vec2<bool>(true);
+    auto* cast = Call<vec2<bool>>(true);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -248,7 +249,7 @@
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_With_Bool_Var) {
     auto* var = Var("v", Expr(true));
-    auto* cast = vec2<bool>(var);
+    auto* cast = Call<vec2<bool>>(var);
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -271,7 +272,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_With_F32_Literal) {
-    auto* cast = vec2<f32>(2_f);
+    auto* cast = Call<vec2<f32>>(2_f);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -290,7 +291,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_With_F16_Literal) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec2<f16>(2_h);
+    auto* cast = Call<vec2<f16>>(2_h);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -308,7 +309,7 @@
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_With_F32_F32) {
     auto* var = Decl(Var("x", ty.f32(), Expr(2_f)));
-    auto* cast = vec2<f32>("x", "x");
+    auto* cast = Call<vec2<f32>>("x", "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -335,7 +336,7 @@
     Enable(builtin::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.f16(), Expr(2_h)));
-    auto* cast = vec2<f16>("x", "x");
+    auto* cast = Call<vec2<f16>>("x", "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -359,7 +360,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_With_F32_F32_Const) {
-    auto* cast = vec2<f32>(1_f, 2_f);
+    auto* cast = Call<vec2<f32>>(1_f, 2_f);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -379,7 +380,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_With_F16_F16_Const) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec2<f16>(1_h, 2_h);
+    auto* cast = Call<vec2<f16>>(1_h, 2_h);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -397,8 +398,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_F32_With_Vec2) {
-    auto* var = Decl(Var("x", ty.vec2<f32>(), vec2<f32>(1_f, 2_f)));
-    auto* cast = vec2<f32>("x");
+    auto* var = Decl(Var("x", ty.vec2<f32>(), Call<vec2<f32>>(1_f, 2_f)));
+    auto* cast = Call<vec2<f32>>("x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -424,8 +425,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_F16_With_Vec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Decl(Var("x", ty.vec2<f16>(), vec2<f16>(1_h, 2_h)));
-    auto* cast = vec2<f16>("x");
+    auto* var = Decl(Var("x", ty.vec2<f16>(), Call<vec2<f16>>(1_h, 2_h)));
+    auto* cast = Call<vec2<f16>>("x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -449,7 +450,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_F32_With_Vec2_Const) {
-    auto* cast = vec2<f32>(vec2<f32>(1_f, 2_f));
+    auto* cast = Call<vec2<f32>>(Call<vec2<f32>>(1_f, 2_f));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -469,7 +470,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_F16_With_Vec2_Const) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec2<f16>(vec2<f16>(1_h, 2_h));
+    auto* cast = Call<vec2<f16>>(Call<vec2<f16>>(1_h, 2_h));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -488,7 +489,7 @@
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F32) {
     auto* var = Decl(Var("x", ty.f32(), Expr(2_f)));
-    auto* cast = vec3<f32>("x", "x", "x");
+    auto* cast = Call<vec3<f32>>("x", "x", "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -516,7 +517,7 @@
     Enable(builtin::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.f16(), Expr(2_h)));
-    auto* cast = vec3<f16>("x", "x", "x");
+    auto* cast = Call<vec3<f16>>("x", "x", "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -541,7 +542,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F32_Const) {
-    auto* cast = vec3<f32>(1_f, 2_f, 3_f);
+    auto* cast = Call<vec3<f32>>(1_f, 2_f, 3_f);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -562,7 +563,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F16_Const) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec3<f16>(1_h, 2_h, 3_h);
+    auto* cast = Call<vec3<f16>>(1_h, 2_h, 3_h);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -582,7 +583,7 @@
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_Bool) {
     auto* var = Decl(Var("x", ty.bool_(), Expr(true)));
-    auto* cast = vec3<bool>("x", "x", "x");
+    auto* cast = Call<vec3<bool>>("x", "x", "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -607,7 +608,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_Bool_Const) {
-    auto* cast = vec3<bool>(true, false, true);
+    auto* cast = Call<vec3<bool>>(true, false, true);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -626,7 +627,7 @@
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F32_F32_F32) {
     auto* var = Decl(Var("x", ty.f32(), Expr(2_f)));
-    auto* cast = vec3<f32>("x", "x", "x");
+    auto* cast = Call<vec3<f32>>("x", "x", "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -654,7 +655,7 @@
     Enable(builtin::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.f16(), Expr(2_h)));
-    auto* cast = vec3<f16>("x", "x", "x");
+    auto* cast = Call<vec3<f16>>("x", "x", "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -679,7 +680,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F32_F32_F32_Const) {
-    auto* cast = vec3<f32>(1_f, 2_f, 3_f);
+    auto* cast = Call<vec3<f32>>(1_f, 2_f, 3_f);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -700,7 +701,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F16_F16_F16_Const) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec3<f16>(1_h, 2_h, 3_h);
+    auto* cast = Call<vec3<f16>>(1_h, 2_h, 3_h);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -719,8 +720,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F32_Vec2) {
-    auto* var = Decl(Var("x", ty.vec2<f32>(), vec2<f32>(2_f, 3_f)));
-    auto* cast = vec3<f32>(1_f, "x");
+    auto* var = Decl(Var("x", ty.vec2<f32>(), Call<vec2<f32>>(2_f, 3_f)));
+    auto* cast = Call<vec3<f32>>(1_f, "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -751,8 +752,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F16_Vec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Decl(Var("x", ty.vec2<f16>(), vec2<f16>(2_h, 3_h)));
-    auto* cast = vec3<f16>(1_h, "x");
+    auto* var = Decl(Var("x", ty.vec2<f16>(), Call<vec2<f16>>(2_h, 3_h)));
+    auto* cast = Call<vec3<f16>>(1_h, "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -781,7 +782,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F32_Vec2_Const) {
-    auto* cast = vec3<f32>(1_f, vec2<f32>(2_f, 3_f));
+    auto* cast = Call<vec3<f32>>(1_f, Call<vec2<f32>>(2_f, 3_f));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -802,7 +803,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F16_Vec2_Const) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec3<f16>(1_h, vec2<f16>(2_h, 3_h));
+    auto* cast = Call<vec3<f16>>(1_h, Call<vec2<f16>>(2_h, 3_h));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -821,8 +822,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_Vec2_F32) {
-    auto* var = Decl(Var("x", ty.vec2<f32>(), vec2<f32>(1_f, 2_f)));
-    auto* cast = vec3<f32>("x", 3_f);
+    auto* var = Decl(Var("x", ty.vec2<f32>(), Call<vec2<f32>>(1_f, 2_f)));
+    auto* cast = Call<vec3<f32>>("x", 3_f);
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -853,8 +854,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_Vec2_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Decl(Var("x", ty.vec2<f16>(), vec2<f16>(1_h, 2_h)));
-    auto* cast = vec3<f16>("x", 3_h);
+    auto* var = Decl(Var("x", ty.vec2<f16>(), Call<vec2<f16>>(1_h, 2_h)));
+    auto* cast = Call<vec3<f16>>("x", 3_h);
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -883,7 +884,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_Vec2_F32_Const) {
-    auto* cast = vec3<f32>(vec2<f32>(1_f, 2_f), 3_f);
+    auto* cast = Call<vec3<f32>>(Call<vec2<f32>>(1_f, 2_f), 3_f);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -904,7 +905,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_Vec2_F16_Const) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec3<f16>(vec2<f16>(1_h, 2_h), 3_h);
+    auto* cast = Call<vec3<f16>>(Call<vec2<f16>>(1_h, 2_h), 3_h);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -923,8 +924,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_F32_With_Vec3) {
-    auto* var = Decl(Var("x", ty.vec3<f32>(), vec3<f32>(1_f, 2_f, 3_f)));
-    auto* cast = vec3<f32>("x");
+    auto* var = Decl(Var("x", ty.vec3<f32>(), Call<vec3<f32>>(1_f, 2_f, 3_f)));
+    auto* cast = Call<vec3<f32>>("x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -951,8 +952,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_F16_With_Vec3) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Decl(Var("x", ty.vec3<f16>(), vec3<f16>(1_h, 2_h, 3_h)));
-    auto* cast = vec3<f16>("x");
+    auto* var = Decl(Var("x", ty.vec3<f16>(), Call<vec3<f16>>(1_h, 2_h, 3_h)));
+    auto* cast = Call<vec3<f16>>("x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -977,7 +978,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_F32_With_Vec3_Const) {
-    auto* cast = vec3<f32>(vec3<f32>(1_f, 2_f, 3_f));
+    auto* cast = Call<vec3<f32>>(Call<vec3<f32>>(1_f, 2_f, 3_f));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -998,7 +999,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_F16_With_Vec3_Const) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec3<f16>(vec3<f16>(1_h, 2_h, 3_h));
+    auto* cast = Call<vec3<f16>>(Call<vec3<f16>>(1_h, 2_h, 3_h));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1018,7 +1019,7 @@
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_Bool) {
     auto* var = Decl(Var("x", ty.bool_(), Expr(true)));
-    auto* cast = vec4<bool>("x");
+    auto* cast = Call<vec4<bool>>("x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1041,7 +1042,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_Bool_Const) {
-    auto* cast = vec4<bool>(true);
+    auto* cast = Call<vec4<bool>>(true);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1059,7 +1060,7 @@
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F32) {
     auto* var = Decl(Var("x", ty.f32(), Expr(2_f)));
-    auto* cast = vec4<f32>("x");
+    auto* cast = Call<vec4<f32>>("x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1085,7 +1086,7 @@
     Enable(builtin::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.f16(), Expr(2_h)));
-    auto* cast = vec4<f16>("x");
+    auto* cast = Call<vec4<f16>>("x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1108,7 +1109,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F32_Const) {
-    auto* cast = vec4<f32>(2_f);
+    auto* cast = Call<vec4<f32>>(2_f);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1127,7 +1128,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_Const) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(2_h);
+    auto* cast = Call<vec4<f16>>(2_h);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1145,7 +1146,7 @@
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F32_F32_F32_F32) {
     auto* var = Decl(Var("x", ty.f32(), Expr(2_f)));
-    auto* cast = vec4<f32>("x", "x", "x", "x");
+    auto* cast = Call<vec4<f32>>("x", "x", "x", "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1174,7 +1175,7 @@
     Enable(builtin::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.f16(), Expr(2_h)));
-    auto* cast = vec4<f16>("x", "x", "x", "x");
+    auto* cast = Call<vec4<f16>>("x", "x", "x", "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1200,7 +1201,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F32_F32_F32_F32_Const) {
-    auto* cast = vec4<f32>(1_f, 2_f, 3_f, 4_f);
+    auto* cast = Call<vec4<f32>>(1_f, 2_f, 3_f, 4_f);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1222,7 +1223,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_F16_F16_F16_Const) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(1_h, 2_h, 3_h, 4_h);
+    auto* cast = Call<vec4<f16>>(1_h, 2_h, 3_h, 4_h);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1242,8 +1243,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F32_F32_Vec2) {
-    auto* var = Decl(Var("x", ty.vec2<f32>(), vec2<f32>(1_f, 2_f)));
-    auto* cast = vec4<f32>(1_f, 2_f, "x");
+    auto* var = Decl(Var("x", ty.vec2<f32>(), Call<vec2<f32>>(1_f, 2_f)));
+    auto* cast = Call<vec4<f32>>(1_f, 2_f, "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1273,8 +1274,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_F16_Vec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Decl(Var("x", ty.vec2<f16>(), vec2<f16>(1_h, 2_h)));
-    auto* cast = vec4<f16>(1_h, 2_h, "x");
+    auto* var = Decl(Var("x", ty.vec2<f16>(), Call<vec2<f16>>(1_h, 2_h)));
+    auto* cast = Call<vec4<f16>>(1_h, 2_h, "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1302,7 +1303,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F32_F32_Vec2_Const) {
-    auto* cast = vec4<f32>(1_f, 2_f, vec2<f32>(3_f, 4_f));
+    auto* cast = Call<vec4<f32>>(1_f, 2_f, Call<vec2<f32>>(3_f, 4_f));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1324,7 +1325,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_F16_Vec2_Const) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(1_h, 2_h, vec2<f16>(3_h, 4_h));
+    auto* cast = Call<vec4<f16>>(1_h, 2_h, Call<vec2<f16>>(3_h, 4_h));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1344,8 +1345,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F32_Vec2_F32) {
-    auto* var = Decl(Var("x", ty.vec2<f32>(), vec2<f32>(2_f, 3_f)));
-    auto* cast = vec4<f32>(1_f, "x", 4_f);
+    auto* var = Decl(Var("x", ty.vec2<f32>(), Call<vec2<f32>>(2_f, 3_f)));
+    auto* cast = Call<vec4<f32>>(1_f, "x", 4_f);
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1377,8 +1378,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_Vec2_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Decl(Var("x", ty.vec2<f16>(), vec2<f16>(2_h, 3_h)));
-    auto* cast = vec4<f16>(1_h, "x", 4_h);
+    auto* var = Decl(Var("x", ty.vec2<f16>(), Call<vec2<f16>>(2_h, 3_h)));
+    auto* cast = Call<vec4<f16>>(1_h, "x", 4_h);
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1408,7 +1409,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F32_Vec2_F32_Const) {
-    auto* cast = vec4<f32>(1_f, vec2<f32>(2_f, 3_f), 4_f);
+    auto* cast = Call<vec4<f32>>(1_f, Call<vec2<f32>>(2_f, 3_f), 4_f);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1430,7 +1431,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_Vec2_F16_Const) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(1_h, vec2<f16>(2_h, 3_h), 4_h);
+    auto* cast = Call<vec4<f16>>(1_h, Call<vec2<f16>>(2_h, 3_h), 4_h);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1450,8 +1451,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_Vec2_F32_F32) {
-    auto* var = Decl(Var("x", ty.vec2<f32>(), vec2<f32>(1_f, 2_f)));
-    auto* cast = vec4<f32>("x", 3_f, 4_f);
+    auto* var = Decl(Var("x", ty.vec2<f32>(), Call<vec2<f32>>(1_f, 2_f)));
+    auto* cast = Call<vec4<f32>>("x", 3_f, 4_f);
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1483,8 +1484,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_Vec2_F16_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Decl(Var("x", ty.vec2<f16>(), vec2<f16>(1_h, 2_h)));
-    auto* cast = vec4<f16>("x", 3_h, 4_h);
+    auto* var = Decl(Var("x", ty.vec2<f16>(), Call<vec2<f16>>(1_h, 2_h)));
+    auto* cast = Call<vec4<f16>>("x", 3_h, 4_h);
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1514,7 +1515,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_Vec2_F32_F32_Const) {
-    auto* cast = vec4<f32>(vec2<f32>(1_f, 2_f), 3_f, 4_f);
+    auto* cast = Call<vec4<f32>>(Call<vec2<f32>>(1_f, 2_f), 3_f, 4_f);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1536,7 +1537,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_Vec2_F16_F16_Const) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(vec2<f16>(1_h, 2_h), 3_h, 4_h);
+    auto* cast = Call<vec4<f16>>(Call<vec2<f16>>(1_h, 2_h), 3_h, 4_h);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1556,8 +1557,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_F32_With_Vec2_Vec2) {
-    auto* var = Decl(Var("x", ty.vec2<f32>(), vec2<f32>(1_f, 2_f)));
-    auto* cast = vec4<f32>("x", "x");
+    auto* var = Decl(Var("x", ty.vec2<f32>(), Call<vec2<f32>>(1_f, 2_f)));
+    auto* cast = Call<vec4<f32>>("x", "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1590,8 +1591,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_F16_With_Vec2_Vec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Decl(Var("x", ty.vec2<f16>(), vec2<f16>(1_h, 2_h)));
-    auto* cast = vec4<f16>("x", "x");
+    auto* var = Decl(Var("x", ty.vec2<f16>(), Call<vec2<f16>>(1_h, 2_h)));
+    auto* cast = Call<vec4<f16>>("x", "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1622,7 +1623,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_F32_With_Vec2_Vec2_Const) {
-    auto* cast = vec4<f32>(vec2<f32>(1_f, 2_f), vec2<f32>(1_f, 2_f));
+    auto* cast = Call<vec4<f32>>(Call<vec2<f32>>(1_f, 2_f), Call<vec2<f32>>(1_f, 2_f));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1642,7 +1643,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_F16_With_Vec2_Vec2_Const) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(vec2<f16>(1_h, 2_h), vec2<f16>(1_h, 2_h));
+    auto* cast = Call<vec4<f16>>(Call<vec2<f16>>(1_h, 2_h), Call<vec2<f16>>(1_h, 2_h));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1660,8 +1661,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F32_Vec3) {
-    auto* var = Decl(Var("x", ty.vec3<f32>(), vec3<f32>(2_f, 2_f, 2_f)));
-    auto* cast = vec4<f32>(2_f, "x");
+    auto* var = Decl(Var("x", ty.vec3<f32>(), Call<vec3<f32>>(2_f, 2_f, 2_f)));
+    auto* cast = Call<vec4<f32>>(2_f, "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1691,8 +1692,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_Vec3) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Decl(Var("x", ty.vec3<f16>(), vec3<f16>(2_h, 2_h, 2_h)));
-    auto* cast = vec4<f16>(2_h, "x");
+    auto* var = Decl(Var("x", ty.vec3<f16>(), Call<vec3<f16>>(2_h, 2_h, 2_h)));
+    auto* cast = Call<vec4<f16>>(2_h, "x");
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1720,7 +1721,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F32_Vec3_Const) {
-    auto* cast = vec4<f32>(2_f, vec3<f32>(2_f, 2_f, 2_f));
+    auto* cast = Call<vec4<f32>>(2_f, Call<vec3<f32>>(2_f, 2_f, 2_f));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1739,7 +1740,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_Vec3_Const) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(2_h, vec3<f16>(2_h, 2_h, 2_h));
+    auto* cast = Call<vec4<f16>>(2_h, Call<vec3<f16>>(2_h, 2_h, 2_h));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1756,8 +1757,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_Vec3_F32) {
-    auto* var = Decl(Var("x", ty.vec3<f32>(), vec3<f32>(2_f, 2_f, 2_f)));
-    auto* cast = vec4<f32>("x", 2_f);
+    auto* var = Decl(Var("x", ty.vec3<f32>(), Call<vec3<f32>>(2_f, 2_f, 2_f)));
+    auto* cast = Call<vec4<f32>>("x", 2_f);
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1787,8 +1788,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_Vec3_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* var = Decl(Var("x", ty.vec3<f16>(), vec3<f16>(2_h, 2_h, 2_h)));
-    auto* cast = vec4<f16>("x", 2_h);
+    auto* var = Decl(Var("x", ty.vec3<f16>(), Call<vec3<f16>>(2_h, 2_h, 2_h)));
+    auto* cast = Call<vec4<f16>>("x", 2_h);
     WrapInFunction(var, cast);
 
     spirv::Builder& b = Build();
@@ -1816,7 +1817,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_Vec3_F32_Const) {
-    auto* cast = vec4<f32>(vec3<f32>(2_f, 2_f, 2_f), 2_f);
+    auto* cast = Call<vec4<f32>>(Call<vec3<f32>>(2_f, 2_f, 2_f), 2_f);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1835,7 +1836,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_Vec3_F16_Const) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(vec3<f16>(2_h, 2_h, 2_h), 2_h);
+    auto* cast = Call<vec4<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h), 2_h);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1852,8 +1853,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_F32_With_Vec4) {
-    auto* value = vec4<f32>(2_f, 2_f, 2_f, 2_f);
-    auto* cast = vec4<f32>(value);
+    auto* value = Call<vec4<f32>>(2_f, 2_f, 2_f, 2_f);
+    auto* cast = Call<vec4<f32>>(value);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -1872,8 +1873,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_F16_With_Vec4) {
     Enable(builtin::Extension::kF16);
 
-    auto* value = vec4<f16>(2_h, 2_h, 2_h, 2_h);
-    auto* cast = vec4<f16>(value);
+    auto* value = Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h);
+    auto* cast = Call<vec4<f16>>(value);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -2050,7 +2051,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec2_With_F32) {
-    auto* cast = vec2<f32>(2_f);
+    auto* cast = Call<vec2<f32>>(2_f);
     GlobalConst("g", ty.vec2<f32>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2075,7 +2076,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec2_With_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec2<f16>(2_h);
+    auto* cast = Call<vec2<f16>>(2_h);
     GlobalConst("g", ty.vec2<f16>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2098,7 +2099,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec2_With_F32) {
-    auto* cast = vec2<f32>(2_f);
+    auto* cast = Call<vec2<f32>>(2_f);
     auto* g = GlobalVar("g", ty.vec2<f32>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2116,7 +2117,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec2_With_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec2<f16>(2_h);
+    auto* cast = Call<vec2<f16>>(2_h);
     auto* g = GlobalVar("g", ty.vec2<f16>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2132,7 +2133,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec2_F32_With_Vec2) {
-    auto* cast = vec2<f32>(vec2<f32>(2_f, 2_f));
+    auto* cast = Call<vec2<f32>>(Call<vec2<f32>>(2_f, 2_f));
     GlobalConst("g", ty.vec2<f32>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2157,7 +2158,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec2_F16_With_Vec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec2<f16>(vec2<f16>(2_h, 2_h));
+    auto* cast = Call<vec2<f16>>(Call<vec2<f16>>(2_h, 2_h));
     GlobalConst("g", ty.vec2<f16>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2180,7 +2181,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec2_F32_With_Vec2) {
-    auto* cast = vec2<f32>(vec2<f32>(2_f, 2_f));
+    auto* cast = Call<vec2<f32>>(Call<vec2<f32>>(2_f, 2_f));
     GlobalVar("a", ty.vec2<f32>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = SanitizeAndBuild();
@@ -2202,7 +2203,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec2_F16_With_Vec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec2<f16>(vec2<f16>(2_h, 2_h));
+    auto* cast = Call<vec2<f16>>(Call<vec2<f16>>(2_h, 2_h));
     GlobalVar("a", ty.vec2<f16>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = SanitizeAndBuild();
@@ -2222,7 +2223,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec3_F32_With_Vec3) {
-    auto* cast = vec3<f32>(vec3<f32>(2_f, 2_f, 2_f));
+    auto* cast = Call<vec3<f32>>(Call<vec3<f32>>(2_f, 2_f, 2_f));
     GlobalConst("g", ty.vec3<f32>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2247,7 +2248,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec3_F16_With_Vec3) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec3<f16>(vec3<f16>(2_h, 2_h, 2_h));
+    auto* cast = Call<vec3<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h));
     GlobalConst("g", ty.vec3<f16>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2270,7 +2271,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec3_F32_With_Vec3) {
-    auto* cast = vec3<f32>(vec3<f32>(2_f, 2_f, 2_f));
+    auto* cast = Call<vec3<f32>>(Call<vec3<f32>>(2_f, 2_f, 2_f));
     GlobalVar("a", ty.vec3<f32>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = SanitizeAndBuild();
@@ -2292,7 +2293,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec3_F16_With_Vec3) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec3<f16>(vec3<f16>(2_h, 2_h, 2_h));
+    auto* cast = Call<vec3<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h));
     GlobalVar("a", ty.vec3<f16>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = SanitizeAndBuild();
@@ -2312,7 +2313,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_F32_With_Vec4) {
-    auto* cast = vec4<f32>(vec4<f32>(2_f, 2_f, 2_f, 2_f));
+    auto* cast = Call<vec4<f32>>(Call<vec4<f32>>(2_f, 2_f, 2_f, 2_f));
     GlobalConst("g", ty.vec4<f32>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2337,7 +2338,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_F16_With_Vec4) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(vec4<f16>(2_h, 2_h, 2_h, 2_h));
+    auto* cast = Call<vec4<f16>>(Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h));
     GlobalConst("g", ty.vec4<f16>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2360,7 +2361,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_F32_With_Vec4) {
-    auto* cast = vec4<f32>(vec4<f32>(2_f, 2_f, 2_f, 2_f));
+    auto* cast = Call<vec4<f32>>(Call<vec4<f32>>(2_f, 2_f, 2_f, 2_f));
     GlobalVar("a", ty.vec4<f32>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = SanitizeAndBuild();
@@ -2382,7 +2383,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_F16_With_Vec4) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(vec4<f16>(2_h, 2_h, 2_h, 2_h));
+    auto* cast = Call<vec4<f16>>(Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h));
     GlobalVar("a", ty.vec4<f16>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = SanitizeAndBuild();
@@ -2402,7 +2403,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec3_With_F32) {
-    auto* cast = vec3<f32>(2_f);
+    auto* cast = Call<vec3<f32>>(2_f);
     GlobalConst("g", ty.vec3<f32>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2427,7 +2428,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec3_With_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec3<f16>(2_h);
+    auto* cast = Call<vec3<f16>>(2_h);
     GlobalConst("g", ty.vec3<f16>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2450,7 +2451,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec3_With_F32) {
-    auto* cast = vec3<f32>(2_f);
+    auto* cast = Call<vec3<f32>>(2_f);
     auto* g = GlobalVar("g", ty.vec3<f32>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2468,7 +2469,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec3_With_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec3<f16>(2_h);
+    auto* cast = Call<vec3<f16>>(2_h);
     auto* g = GlobalVar("g", ty.vec3<f16>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2484,7 +2485,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec3_With_F32_Vec2) {
-    auto* cast = vec3<f32>(2_f, vec2<f32>(2_f, 2_f));
+    auto* cast = Call<vec3<f32>>(2_f, Call<vec2<f32>>(2_f, 2_f));
     GlobalConst("g", ty.vec3<f32>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2509,7 +2510,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec3_With_F16_Vec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec3<f16>(2_h, vec2<f16>(2_h, 2_h));
+    auto* cast = Call<vec3<f16>>(2_h, Call<vec2<f16>>(2_h, 2_h));
     GlobalConst("g", ty.vec3<f16>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2532,7 +2533,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec3_With_F32_Vec2) {
-    auto* cast = vec3<f32>(2_f, vec2<f32>(2_f, 2_f));
+    auto* cast = Call<vec3<f32>>(2_f, Call<vec2<f32>>(2_f, 2_f));
     auto* g = GlobalVar("g", ty.vec3<f32>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2550,7 +2551,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec3_With_F16_Vec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec3<f16>(2_h, vec2<f16>(2_h, 2_h));
+    auto* cast = Call<vec3<f16>>(2_h, Call<vec2<f16>>(2_h, 2_h));
     auto* g = GlobalVar("g", ty.vec3<f16>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2566,7 +2567,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec3_With_Vec2_F32) {
-    auto* cast = vec3<f32>(vec2<f32>(2_f, 2_f), 2_f);
+    auto* cast = Call<vec3<f32>>(Call<vec2<f32>>(2_f, 2_f), 2_f);
     GlobalConst("g", ty.vec3<f32>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2591,7 +2592,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec3_With_Vec2_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec3<f16>(vec2<f16>(2_h, 2_h), 2_h);
+    auto* cast = Call<vec3<f16>>(Call<vec2<f16>>(2_h, 2_h), 2_h);
     GlobalConst("g", ty.vec3<f16>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2614,7 +2615,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec3_With_Vec2_F32) {
-    auto* cast = vec3<f32>(vec2<f32>(2_f, 2_f), 2_f);
+    auto* cast = Call<vec3<f32>>(Call<vec2<f32>>(2_f, 2_f), 2_f);
     auto* g = GlobalVar("g", ty.vec3<f32>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2632,7 +2633,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec3_With_Vec2_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec3<f16>(vec2<f16>(2_h, 2_h), 2_h);
+    auto* cast = Call<vec3<f16>>(Call<vec2<f16>>(2_h, 2_h), 2_h);
     auto* g = GlobalVar("g", ty.vec3<f16>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2648,7 +2649,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_F32) {
-    auto* cast = vec4<f32>(2_f);
+    auto* cast = Call<vec4<f32>>(2_f);
     GlobalConst("g", ty.vec4<f32>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2673,7 +2674,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(2_h);
+    auto* cast = Call<vec4<f16>>(2_h);
     GlobalConst("g", ty.vec4<f16>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2696,7 +2697,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_F32) {
-    auto* cast = vec4<f32>(2_f);
+    auto* cast = Call<vec4<f32>>(2_f);
     auto* g = GlobalVar("g", ty.vec4<f32>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2714,7 +2715,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(2_h);
+    auto* cast = Call<vec4<f16>>(2_h);
     auto* g = GlobalVar("g", ty.vec4<f16>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2730,7 +2731,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_F32_F32_Vec2) {
-    auto* cast = vec4<f32>(2_f, 2_f, vec2<f32>(2_f, 2_f));
+    auto* cast = Call<vec4<f32>>(2_f, 2_f, Call<vec2<f32>>(2_f, 2_f));
     GlobalConst("g", ty.vec4<f32>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2755,7 +2756,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_F16_F16_Vec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(2_h, 2_h, vec2<f16>(2_h, 2_h));
+    auto* cast = Call<vec4<f16>>(2_h, 2_h, Call<vec2<f16>>(2_h, 2_h));
     GlobalConst("g", ty.vec4<f16>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2778,7 +2779,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_F32_F32_Vec2) {
-    auto* cast = vec4<f32>(2_f, 2_f, vec2<f32>(2_f, 2_f));
+    auto* cast = Call<vec4<f32>>(2_f, 2_f, Call<vec2<f32>>(2_f, 2_f));
     auto* g = GlobalVar("g", ty.vec4<f32>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2796,7 +2797,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_F16_F16_Vec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(2_h, 2_h, vec2<f16>(2_h, 2_h));
+    auto* cast = Call<vec4<f16>>(2_h, 2_h, Call<vec2<f16>>(2_h, 2_h));
     auto* g = GlobalVar("g", ty.vec4<f16>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2812,7 +2813,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_F32_Vec2_F32) {
-    auto* cast = vec4<f32>(2_f, vec2<f32>(2_f, 2_f), 2_f);
+    auto* cast = Call<vec4<f32>>(2_f, Call<vec2<f32>>(2_f, 2_f), 2_f);
     GlobalConst("g", ty.vec4<f32>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2837,7 +2838,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_F16_Vec2_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(2_h, vec2<f16>(2_h, 2_h), 2_h);
+    auto* cast = Call<vec4<f16>>(2_h, Call<vec2<f16>>(2_h, 2_h), 2_h);
     GlobalConst("g", ty.vec4<f16>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2860,7 +2861,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_F32_Vec2_F32) {
-    auto* cast = vec4<f32>(2_f, vec2<f32>(2_f, 2_f), 2_f);
+    auto* cast = Call<vec4<f32>>(2_f, Call<vec2<f32>>(2_f, 2_f), 2_f);
     auto* g = GlobalVar("g", ty.vec4<f32>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2878,7 +2879,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_F16_Vec2_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(2_h, vec2<f16>(2_h, 2_h), 2_h);
+    auto* cast = Call<vec4<f16>>(2_h, Call<vec2<f16>>(2_h, 2_h), 2_h);
     auto* g = GlobalVar("g", ty.vec4<f16>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2894,7 +2895,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_Vec2_F32_F32) {
-    auto* cast = vec4<f32>(vec2<f32>(2_f, 2_f), 2_f, 2_f);
+    auto* cast = Call<vec4<f32>>(Call<vec2<f32>>(2_f, 2_f), 2_f, 2_f);
     GlobalConst("g", ty.vec4<f32>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2919,7 +2920,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_Vec2_F16_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(vec2<f16>(2_h, 2_h), 2_h, 2_h);
+    auto* cast = Call<vec4<f16>>(Call<vec2<f16>>(2_h, 2_h), 2_h, 2_h);
     GlobalConst("g", ty.vec4<f16>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -2942,7 +2943,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_Vec2_F32_F32) {
-    auto* cast = vec4<f32>(vec2<f32>(2_f, 2_f), 2_f, 2_f);
+    auto* cast = Call<vec4<f32>>(Call<vec2<f32>>(2_f, 2_f), 2_f, 2_f);
     auto* g = GlobalVar("g", ty.vec4<f32>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2960,7 +2961,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_Vec2_F16_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(vec2<f16>(2_h, 2_h), 2_h, 2_h);
+    auto* cast = Call<vec4<f16>>(Call<vec2<f16>>(2_h, 2_h), 2_h, 2_h);
     auto* g = GlobalVar("g", ty.vec4<f16>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -2976,7 +2977,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_F32_With_Vec2_Vec2) {
-    auto* cast = vec4<f32>(vec2<f32>(2_f, 2_f), vec2<f32>(2_f, 2_f));
+    auto* cast = Call<vec4<f32>>(Call<vec2<f32>>(2_f, 2_f), Call<vec2<f32>>(2_f, 2_f));
     GlobalConst("g", ty.vec4<f32>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -3001,7 +3002,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_F16_With_Vec2_Vec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(vec2<f16>(2_h, 2_h), vec2<f16>(2_h, 2_h));
+    auto* cast = Call<vec4<f16>>(Call<vec2<f16>>(2_h, 2_h), Call<vec2<f16>>(2_h, 2_h));
     GlobalConst("g", ty.vec4<f16>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -3024,7 +3025,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_F32_With_Vec2_Vec2) {
-    auto* cast = vec4<f32>(vec2<f32>(2_f, 2_f), vec2<f32>(2_f, 2_f));
+    auto* cast = Call<vec4<f32>>(Call<vec2<f32>>(2_f, 2_f), Call<vec2<f32>>(2_f, 2_f));
     auto* g = GlobalVar("g", ty.vec4<f32>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -3042,7 +3043,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_F16_With_Vec2_Vec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(vec2<f16>(2_h, 2_h), vec2<f16>(2_h, 2_h));
+    auto* cast = Call<vec4<f16>>(Call<vec2<f16>>(2_h, 2_h), Call<vec2<f16>>(2_h, 2_h));
     auto* g = GlobalVar("g", ty.vec4<f16>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -3058,7 +3059,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_F32_Vec3) {
-    auto* cast = vec4<f32>(2_f, vec3<f32>(2_f, 2_f, 2_f));
+    auto* cast = Call<vec4<f32>>(2_f, Call<vec3<f32>>(2_f, 2_f, 2_f));
     GlobalConst("g", ty.vec4<f32>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -3081,7 +3082,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_F32_Vec3) {
-    auto* cast = vec4<f32>(2_f, vec3<f32>(2_f, 2_f, 2_f));
+    auto* cast = Call<vec4<f32>>(2_f, Call<vec3<f32>>(2_f, 2_f, 2_f));
     auto* g = GlobalVar("g", ty.vec4<f32>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -3099,7 +3100,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_F16_Vec3) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(2_h, vec3<f16>(2_h, 2_h, 2_h));
+    auto* cast = Call<vec4<f16>>(2_h, Call<vec3<f16>>(2_h, 2_h, 2_h));
     auto* g = GlobalVar("g", ty.vec4<f16>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -3115,7 +3116,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_Vec3_F32) {
-    auto* cast = vec4<f32>(vec3<f32>(2_f, 2_f, 2_f), 2_f);
+    auto* cast = Call<vec4<f32>>(Call<vec3<f32>>(2_f, 2_f, 2_f), 2_f);
     GlobalConst("g", ty.vec4<f32>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -3140,7 +3141,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_Vec3_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(vec3<f16>(2_h, 2_h, 2_h), 2_h);
+    auto* cast = Call<vec4<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h), 2_h);
     GlobalConst("g", ty.vec4<f16>(), cast);
     WrapInFunction(Decl(Var("l", Expr("g"))));
 
@@ -3163,7 +3164,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_Vec3_F32) {
-    auto* cast = vec4<f32>(vec3<f32>(2_f, 2_f, 2_f), 2_f);
+    auto* cast = Call<vec4<f32>>(Call<vec3<f32>>(2_f, 2_f, 2_f), 2_f);
     auto* g = GlobalVar("g", ty.vec4<f32>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -3181,7 +3182,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_Vec3_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec4<f16>(vec3<f16>(2_h, 2_h, 2_h), 2_h);
+    auto* cast = Call<vec4<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h), 2_h);
     auto* g = GlobalVar("g", ty.vec4<f16>(), builtin::AddressSpace::kPrivate, cast);
 
     spirv::Builder& b = Build();
@@ -3197,7 +3198,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat2x2_F32_With_Vec2_Vec2) {
-    auto* cast = mat2x2<f32>(vec2<f32>(2_f, 2_f), vec2<f32>(2_f, 2_f));
+    auto* cast = Call<mat2x2<f32>>(Call<vec2<f32>>(2_f, 2_f), Call<vec2<f32>>(2_f, 2_f));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3217,7 +3218,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Mat2x2_F16_With_Vec2_Vec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = mat2x2<f16>(vec2<f16>(2_h, 2_h), vec2<f16>(2_h, 2_h));
+    auto* cast = Call<mat2x2<f16>>(Call<vec2<f16>>(2_h, 2_h), Call<vec2<f16>>(2_h, 2_h));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3235,7 +3236,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat3x2_F32_With_Vec2_Vec2_Vec2) {
-    auto* cast = mat3x2<f32>(vec2<f32>(2_f, 2_f), vec2<f32>(2_f, 2_f), vec2<f32>(2_f, 2_f));
+    auto* cast = Call<mat3x2<f32>>(Call<vec2<f32>>(2_f, 2_f), Call<vec2<f32>>(2_f, 2_f),
+                                   Call<vec2<f32>>(2_f, 2_f));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3255,7 +3257,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Mat3x2_F16_With_Vec2_Vec2_Vec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = mat3x2<f16>(vec2<f16>(2_h, 2_h), vec2<f16>(2_h, 2_h), vec2<f16>(2_h, 2_h));
+    auto* cast = Call<mat3x2<f16>>(Call<vec2<f16>>(2_h, 2_h), Call<vec2<f16>>(2_h, 2_h),
+                                   Call<vec2<f16>>(2_h, 2_h));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3273,8 +3276,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat4x2_F32_With_Vec2_Vec2_Vec2_Vec2) {
-    auto* cast = mat4x2<f32>(vec2<f32>(2_f, 2_f), vec2<f32>(2_f, 2_f), vec2<f32>(2_f, 2_f),
-                             vec2<f32>(2_f, 2_f));
+    auto* cast = Call<mat4x2<f32>>(Call<vec2<f32>>(2_f, 2_f), Call<vec2<f32>>(2_f, 2_f),
+                                   Call<vec2<f32>>(2_f, 2_f), Call<vec2<f32>>(2_f, 2_f));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3294,8 +3297,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Mat4x2_F16_With_Vec2_Vec2_Vec2_Vec2) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = mat4x2<f16>(vec2<f16>(2_h, 2_h), vec2<f16>(2_h, 2_h), vec2<f16>(2_h, 2_h),
-                             vec2<f16>(2_h, 2_h));
+    auto* cast = Call<mat4x2<f16>>(Call<vec2<f16>>(2_h, 2_h), Call<vec2<f16>>(2_h, 2_h),
+                                   Call<vec2<f16>>(2_h, 2_h), Call<vec2<f16>>(2_h, 2_h));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3313,7 +3316,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat2x3_F32_With_Vec3_Vec3) {
-    auto* cast = mat2x3<f32>(vec3<f32>(2_f, 2_f, 2_f), vec3<f32>(2_f, 2_f, 2_f));
+    auto* cast = Call<mat2x3<f32>>(Call<vec3<f32>>(2_f, 2_f, 2_f), Call<vec3<f32>>(2_f, 2_f, 2_f));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3333,7 +3336,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Mat2x3_F16_With_Vec3_Vec3) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = mat2x3<f16>(vec3<f16>(2_h, 2_h, 2_h), vec3<f16>(2_h, 2_h, 2_h));
+    auto* cast = Call<mat2x3<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h), Call<vec3<f16>>(2_h, 2_h, 2_h));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3351,8 +3354,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat3x3_F32_With_Vec3_Vec3_Vec3) {
-    auto* cast =
-        mat3x3<f32>(vec3<f32>(2_f, 2_f, 2_f), vec3<f32>(2_f, 2_f, 2_f), vec3<f32>(2_f, 2_f, 2_f));
+    auto* cast = Call<mat3x3<f32>>(Call<vec3<f32>>(2_f, 2_f, 2_f), Call<vec3<f32>>(2_f, 2_f, 2_f),
+                                   Call<vec3<f32>>(2_f, 2_f, 2_f));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3372,8 +3375,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Mat3x3_F16_With_Vec3_Vec3_Vec3) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast =
-        mat3x3<f16>(vec3<f16>(2_h, 2_h, 2_h), vec3<f16>(2_h, 2_h, 2_h), vec3<f16>(2_h, 2_h, 2_h));
+    auto* cast = Call<mat3x3<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h), Call<vec3<f16>>(2_h, 2_h, 2_h),
+                                   Call<vec3<f16>>(2_h, 2_h, 2_h));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3391,8 +3394,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat4x3_F32_With_Vec3_Vec3_Vec3_Vec3) {
-    auto* cast = mat4x3<f32>(vec3<f32>(2_f, 2_f, 2_f), vec3<f32>(2_f, 2_f, 2_f),
-                             vec3<f32>(2_f, 2_f, 2_f), vec3<f32>(2_f, 2_f, 2_f));
+    auto* cast = Call<mat4x3<f32>>(Call<vec3<f32>>(2_f, 2_f, 2_f), Call<vec3<f32>>(2_f, 2_f, 2_f),
+                                   Call<vec3<f32>>(2_f, 2_f, 2_f), Call<vec3<f32>>(2_f, 2_f, 2_f));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3412,8 +3415,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Mat4x3_F16_With_Vec3_Vec3_Vec3_Vec3) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = mat4x3<f16>(vec3<f16>(2_h, 2_h, 2_h), vec3<f16>(2_h, 2_h, 2_h),
-                             vec3<f16>(2_h, 2_h, 2_h), vec3<f16>(2_h, 2_h, 2_h));
+    auto* cast = Call<mat4x3<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h), Call<vec3<f16>>(2_h, 2_h, 2_h),
+                                   Call<vec3<f16>>(2_h, 2_h, 2_h), Call<vec3<f16>>(2_h, 2_h, 2_h));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3431,7 +3434,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat2x4_F32_With_Vec4_Vec4) {
-    auto* cast = mat2x4<f32>(vec4<f32>(2_f, 2_f, 2_f, 2_f), vec4<f32>(2_f, 2_f, 2_f, 2_f));
+    auto* cast =
+        Call<mat2x4<f32>>(Call<vec4<f32>>(2_f, 2_f, 2_f, 2_f), Call<vec4<f32>>(2_f, 2_f, 2_f, 2_f));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3451,7 +3455,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Mat2x4_F16_With_Vec4_Vec4) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = mat2x4<f16>(vec4<f16>(2_h, 2_h, 2_h, 2_h), vec4<f16>(2_h, 2_h, 2_h, 2_h));
+    auto* cast =
+        Call<mat2x4<f16>>(Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h), Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3469,8 +3474,9 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat3x4_F32_With_Vec4_Vec4_Vec4) {
-    auto* cast = mat3x4<f32>(vec4<f32>(2_f, 2_f, 2_f, 2_f), vec4<f32>(2_f, 2_f, 2_f, 2_f),
-                             vec4<f32>(2_f, 2_f, 2_f, 2_f));
+    auto* cast =
+        Call<mat3x4<f32>>(Call<vec4<f32>>(2_f, 2_f, 2_f, 2_f), Call<vec4<f32>>(2_f, 2_f, 2_f, 2_f),
+                          Call<vec4<f32>>(2_f, 2_f, 2_f, 2_f));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3490,8 +3496,9 @@
 TEST_F(SpvBuilderConstructorTest, Type_Mat3x4_F16_With_Vec4_Vec4_Vec4) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = mat3x4<f16>(vec4<f16>(2_h, 2_h, 2_h, 2_h), vec4<f16>(2_h, 2_h, 2_h, 2_h),
-                             vec4<f16>(2_h, 2_h, 2_h, 2_h));
+    auto* cast =
+        Call<mat3x4<f16>>(Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h), Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h),
+                          Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3509,8 +3516,9 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat4x4_F32_With_Vec4_Vec4_Vec4_Vec4) {
-    auto* cast = mat4x4<f32>(vec4<f32>(2_f, 2_f, 2_f, 2_f), vec4<f32>(2_f, 2_f, 2_f, 2_f),
-                             vec4<f32>(2_f, 2_f, 2_f, 2_f), vec4<f32>(2_f, 2_f, 2_f, 2_f));
+    auto* cast =
+        Call<mat4x4<f32>>(Call<vec4<f32>>(2_f, 2_f, 2_f, 2_f), Call<vec4<f32>>(2_f, 2_f, 2_f, 2_f),
+                          Call<vec4<f32>>(2_f, 2_f, 2_f, 2_f), Call<vec4<f32>>(2_f, 2_f, 2_f, 2_f));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3530,8 +3538,9 @@
 TEST_F(SpvBuilderConstructorTest, Type_Mat4x4_F16_With_Vec4_Vec4_Vec4_Vec4) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = mat4x4<f16>(vec4<f16>(2_h, 2_h, 2_h, 2_h), vec4<f16>(2_h, 2_h, 2_h, 2_h),
-                             vec4<f16>(2_h, 2_h, 2_h, 2_h), vec4<f16>(2_h, 2_h, 2_h, 2_h));
+    auto* cast =
+        Call<mat4x4<f16>>(Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h), Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h),
+                          Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h), Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h));
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3549,7 +3558,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Array_5_F32) {
-    auto* cast = array<f32, 5>(2_f, 2_f, 2_f, 2_f, 2_f);
+    auto* cast = Call<array<f32, 5>>(2_f, 2_f, 2_f, 2_f, 2_f);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3569,7 +3578,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Array_5_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = array<f16, 5>(2_h, 2_h, 2_h, 2_h, 2_h);
+    auto* cast = Call<array<f16, 5>>(2_h, 2_h, 2_h, 2_h, 2_h);
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -3587,9 +3596,9 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Array_2_Vec3_F32) {
-    auto* first = vec3<f32>(1_f, 2_f, 3_f);
-    auto* second = vec3<f32>(1_f, 2_f, 3_f);
-    auto* t = Call(ty.array(ty.vec3<f32>(), 2_u), first, second);
+    auto* first = Call<vec3<f32>>(1_f, 2_f, 3_f);
+    auto* second = Call<vec3<f32>>(1_f, 2_f, 3_f);
+    auto* t = Call(ty.array<vec3<f32>, 2>(), first, second);
     WrapInFunction(t);
     spirv::Builder& b = Build();
 
@@ -3611,9 +3620,9 @@
 TEST_F(SpvBuilderConstructorTest, Type_Array_2_Vec3_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* first = vec3<f16>(1_h, 2_h, 3_h);
-    auto* second = vec3<f16>(1_h, 2_h, 3_h);
-    auto* t = Call(ty.array(ty.vec3<f16>(), 2_u), first, second);
+    auto* first = Call<vec3<f16>>(1_h, 2_h, 3_h);
+    auto* second = Call<vec3<f16>>(1_h, 2_h, 3_h);
+    auto* t = Call(ty.array<vec3<f16>, 2>(), first, second);
     WrapInFunction(t);
     spirv::Builder& b = Build();
 
@@ -3633,8 +3642,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, CommonInitializer_TwoVectors) {
-    auto* v1 = vec3<f32>(2_f, 2_f, 2_f);
-    auto* v2 = vec3<f32>(2_f, 2_f, 2_f);
+    auto* v1 = Call<vec3<f32>>(2_f, 2_f, 2_f);
+    auto* v2 = Call<vec3<f32>>(2_f, 2_f, 2_f);
     WrapInFunction(WrapInStatement(v1), WrapInStatement(v2));
 
     spirv::Builder& b = Build();
@@ -3651,8 +3660,8 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, CommonInitializer_TwoArrays) {
-    auto* a1 = array<f32, 3>(2_f, 2_f, 2_f);
-    auto* a2 = array<f32, 3>(2_f, 2_f, 2_f);
+    auto* a1 = Call<array<f32, 3>>(2_f, 2_f, 2_f);
+    auto* a2 = Call<array<f32, 3>>(2_f, 2_f, 2_f);
     WrapInFunction(WrapInStatement(a1), WrapInStatement(a2));
 
     spirv::Builder& b = Build();
@@ -3674,8 +3683,8 @@
     // Test that initializers of different types with the same values produce
     // different OpConstantComposite instructions.
     // crbug.com/tint/777
-    auto* a1 = array<f32, 2>(1_f, 2_f);
-    auto* a2 = vec2<f32>(1_f, 2_f);
+    auto* a1 = Call<array<f32, 2>>(1_f, 2_f);
+    auto* a2 = Call<vec2<f32>>(1_f, 2_f);
     WrapInFunction(WrapInStatement(a1), WrapInStatement(a2));
     spirv::Builder& b = Build();
 
@@ -3701,7 +3710,7 @@
                                          Member("b", ty.vec3<f32>()),
                                      });
 
-    auto* t = Call(ty.Of(s), 2_f, vec3<f32>(2_f, 2_f, 2_f));
+    auto* t = Call(ty.Of(s), 2_f, Call<vec3<f32>>(2_f, 2_f, 2_f));
     WrapInFunction(t);
 
     spirv::Builder& b = Build();
@@ -3808,7 +3817,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_ZeroInit_Vector) {
-    auto* t = vec2<i32>();
+    auto* t = Call<vec2<i32>>();
 
     WrapInFunction(t);
 
@@ -3826,7 +3835,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_ZeroInit_Matrix_F32) {
-    auto* t = mat4x2<f32>();
+    auto* t = Call<mat4x2<f32>>();
 
     WrapInFunction(t);
 
@@ -3847,7 +3856,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_ZeroInit_Matrix_F16) {
     Enable(builtin::Extension::kF16);
 
-    auto* t = mat4x2<f16>();
+    auto* t = Call<mat4x2<f16>>();
 
     WrapInFunction(t);
 
@@ -3866,7 +3875,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_ZeroInit_Array) {
-    auto* t = array<i32, 2>();
+    auto* t = Call<array<i32, 2>>();
 
     WrapInFunction(t);
 
@@ -4206,7 +4215,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Convert_Vectors_U32_to_I32) {
     auto* var = GlobalVar("i", ty.vec3<u32>(), builtin::AddressSpace::kPrivate);
 
-    auto* cast = vec3<i32>("i");
+    auto* cast = Call<vec3<i32>>("i");
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -4232,7 +4241,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Convert_Vectors_F32_to_I32) {
     auto* var = GlobalVar("i", ty.vec3<f32>(), builtin::AddressSpace::kPrivate);
 
-    auto* cast = vec3<i32>("i");
+    auto* cast = Call<vec3<i32>>("i");
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -4260,7 +4269,7 @@
 
     auto* var = GlobalVar("i", ty.vec3<f16>(), builtin::AddressSpace::kPrivate);
 
-    auto* cast = vec3<i32>("i");
+    auto* cast = Call<vec3<i32>>("i");
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -4286,7 +4295,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Convert_Vectors_I32_to_U32) {
     auto* var = GlobalVar("i", ty.vec3<i32>(), builtin::AddressSpace::kPrivate);
 
-    auto* cast = vec3<u32>("i");
+    auto* cast = Call<vec3<u32>>("i");
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -4312,7 +4321,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Convert_Vectors_F32_to_U32) {
     auto* var = GlobalVar("i", ty.vec3<f32>(), builtin::AddressSpace::kPrivate);
 
-    auto* cast = vec3<u32>("i");
+    auto* cast = Call<vec3<u32>>("i");
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -4340,7 +4349,7 @@
 
     auto* var = GlobalVar("i", ty.vec3<f16>(), builtin::AddressSpace::kPrivate);
 
-    auto* cast = vec3<u32>("i");
+    auto* cast = Call<vec3<u32>>("i");
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -4366,7 +4375,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Convert_Vectors_I32_to_F32) {
     auto* var = GlobalVar("i", ty.vec3<i32>(), builtin::AddressSpace::kPrivate);
 
-    auto* cast = vec3<f32>("i");
+    auto* cast = Call<vec3<f32>>("i");
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -4392,7 +4401,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_Convert_Vectors_U32_to_F32) {
     auto* var = GlobalVar("i", ty.vec3<u32>(), builtin::AddressSpace::kPrivate);
 
-    auto* cast = vec3<f32>("i");
+    auto* cast = Call<vec3<f32>>("i");
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -4420,7 +4429,7 @@
 
     auto* var = GlobalVar("i", ty.vec3<f16>(), builtin::AddressSpace::kPrivate);
 
-    auto* cast = vec3<f32>("i");
+    auto* cast = Call<vec3<f32>>("i");
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -4448,7 +4457,7 @@
 
     auto* var = GlobalVar("i", ty.vec3<i32>(), builtin::AddressSpace::kPrivate);
 
-    auto* cast = vec3<f16>("i");
+    auto* cast = Call<vec3<f16>>("i");
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -4476,7 +4485,7 @@
 
     auto* var = GlobalVar("i", ty.vec3<u32>(), builtin::AddressSpace::kPrivate);
 
-    auto* cast = vec3<f16>("i");
+    auto* cast = Call<vec3<f16>>("i");
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -4504,7 +4513,7 @@
 
     auto* var = GlobalVar("i", ty.vec3<f32>(), builtin::AddressSpace::kPrivate);
 
-    auto* cast = vec3<f16>("i");
+    auto* cast = Call<vec3<f16>>("i");
     WrapInFunction(cast);
 
     spirv::Builder& b = Build();
@@ -4529,7 +4538,7 @@
 
 TEST_F(SpvBuilderConstructorTest, IsConstructorConst_GlobalVectorWithAllConstInitializers) {
     // vec3<f32>(1.0, 2.0, 3.0)  -> true
-    auto* t = vec3<f32>(1_f, 2_f, 3_f);
+    auto* t = Call<vec3<f32>>(1_f, 2_f, 3_f);
     WrapInFunction(t);
 
     spirv::Builder& b = Build();
@@ -4541,8 +4550,8 @@
 TEST_F(SpvBuilderConstructorTest, IsConstructorConst_GlobalArrayWithAllConstInitializers) {
     // array<vec3<f32>, 2u>(vec3<f32>(1.0, 2.0, 3.0), vec3<f32>(1.0, 2.0, 3.0))
     //   -> true
-    auto* t =
-        Call(ty.array(ty.vec3<f32>(), 2_u), vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(1_f, 2_f, 3_f));
+    auto* t = Call(ty.array<vec3<f32>, 2>(), Call<vec3<f32>>(1_f, 2_f, 3_f),
+                   Call<vec3<f32>>(1_f, 2_f, 3_f));
     WrapInFunction(t);
 
     spirv::Builder& b = Build();
@@ -4554,7 +4563,7 @@
 TEST_F(SpvBuilderConstructorTest, IsConstructorConst_GlobalVectorWithMatchingTypeInitializers) {
     // vec2<f32>(f32(1.0), f32(2.0))  -> false
 
-    auto* t = vec2<f32>(Call<f32>(1_f), Call<f32>(2_f));
+    auto* t = Call<vec2<f32>>(Call<f32>(1_f), Call<f32>(2_f));
     WrapInFunction(t);
 
     spirv::Builder& b = Build();
@@ -4566,7 +4575,7 @@
 TEST_F(SpvBuilderConstructorTest, IsConstructorConst_GlobalWithTypeConversionInitializer) {
     // vec2<f32>(f32(1), f32(2)) -> false
 
-    auto* t = vec2<f32>(Call<f32>(1_i), Call<f32>(2_i));
+    auto* t = Call<vec2<f32>>(Call<f32>(1_i), Call<f32>(2_i));
     WrapInFunction(t);
 
     spirv::Builder& b = Build();
@@ -4578,7 +4587,7 @@
 TEST_F(SpvBuilderConstructorTest, IsConstructorConst_VectorWithAllConstInitializers) {
     // vec3<f32>(1.0, 2.0, 3.0)  -> true
 
-    auto* t = vec3<f32>(1_f, 2_f, 3_f);
+    auto* t = Call<vec3<f32>>(1_f, 2_f, 3_f);
     WrapInFunction(t);
 
     spirv::Builder& b = Build();
@@ -4594,7 +4603,7 @@
     GlobalVar("b", ty.f32(), builtin::AddressSpace::kPrivate);
     GlobalVar("c", ty.f32(), builtin::AddressSpace::kPrivate);
 
-    auto* t = vec3<f32>("a", "b", "c");
+    auto* t = Call<vec3<f32>>("a", "b", "c");
     WrapInFunction(t);
 
     spirv::Builder& b = Build();
@@ -4607,10 +4616,10 @@
     // array<vec3<f32>, 2u>(vec3<f32>(1.0, 2.0, 3.0), vec3<f32>(1.0, 2.0, 3.0))
     //   -> true
 
-    auto* first = vec3<f32>(1_f, 2_f, 3_f);
-    auto* second = vec3<f32>(1_f, 2_f, 3_f);
+    auto* first = Call<vec3<f32>>(1_f, 2_f, 3_f);
+    auto* second = Call<vec3<f32>>(1_f, 2_f, 3_f);
 
-    auto* t = Call(ty.array(ty.vec3<f32>(), 2_u), first, second);
+    auto* t = Call(ty.array<vec3<f32>, 2>(), first, second);
     WrapInFunction(t);
 
     spirv::Builder& b = Build();
@@ -4622,7 +4631,7 @@
 TEST_F(SpvBuilderConstructorTest, IsConstructorConst_VectorWithTypeConversionConstInitializers) {
     // vec2<f32>(f32(1), f32(2))  -> false
 
-    auto* t = vec2<f32>(Call<f32>(1_i), Call<f32>(2_i));
+    auto* t = Call<vec2<f32>>(Call<f32>(1_i), Call<f32>(2_i));
     WrapInFunction(t);
 
     spirv::Builder& b = Build();
@@ -4632,7 +4641,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, IsConstructorConst_BitCastScalars) {
-    auto* t = vec2<u32>(Call<u32>(1_i), Call<u32>(1_i));
+    auto* t = Call<vec2<u32>>(Call<u32>(1_i), Call<u32>(1_i));
     WrapInFunction(t);
 
     spirv::Builder& b = Build();
@@ -4647,7 +4656,7 @@
                                          Member("b", ty.vec3<f32>()),
                                      });
 
-    auto* t = Call(ty.Of(s), 2_f, vec3<f32>(2_f, 2_f, 2_f));
+    auto* t = Call(ty.Of(s), 2_f, Call<vec3<f32>>(2_f, 2_f, 2_f));
     WrapInFunction(t);
 
     spirv::Builder& b = Build();
@@ -4680,8 +4689,8 @@
     // }
     // let y = vec3<f32>(1.0, 2.0, 3.0); // Reuses the ID 'x'
 
-    WrapInFunction(If(true, Block(Decl(Let("x", vec3<f32>(1_f, 2_f, 3_f))))),
-                   Decl(Let("y", vec3<f32>(1_f, 2_f, 3_f))));
+    WrapInFunction(If(true, Block(Decl(Let("x", Call<vec3<f32>>(1_f, 2_f, 3_f))))),
+                   Decl(Let("y", Call<vec3<f32>>(1_f, 2_f, 3_f))));
 
     spirv::Builder& b = SanitizeAndBuild();
     ASSERT_TRUE(b.Build());
@@ -4725,8 +4734,8 @@
     // let y = vec3<f32>(one, 2.0, 3.0); // Mustn't reuse the ID 'x'
 
     WrapInFunction(Decl(Var("one", Expr(1_f))),
-                   If(true, Block(Decl(Let("x", vec3<f32>("one", 2_f, 3_f))))),
-                   Decl(Let("y", vec3<f32>("one", 2_f, 3_f))));
+                   If(true, Block(Decl(Let("x", Call<vec3<f32>>("one", 2_f, 3_f))))),
+                   Decl(Let("y", Call<vec3<f32>>("one", 2_f, 3_f))));
 
     spirv::Builder& b = SanitizeAndBuild();
     ASSERT_TRUE(b.Build());
diff --git a/src/tint/writer/spirv/builder_entry_point_test.cc b/src/tint/writer/spirv/builder_entry_point_test.cc
index 0e057a3..b13eb1d 100644
--- a/src/tint/writer/spirv/builder_entry_point_test.cc
+++ b/src/tint/writer/spirv/builder_entry_point_test.cc
@@ -29,7 +29,8 @@
 #include "src/tint/writer/spirv/spv_dump.h"
 #include "src/tint/writer/spirv/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::spirv {
 namespace {
@@ -215,7 +216,7 @@
             Member("pos", ty.vec4<f32>(), utils::Vector{Builtin(builtin::BuiltinValue::kPosition)}),
         });
 
-    auto* vert_retval = Call(ty.Of(interface), 42_f, vec4<f32>());
+    auto* vert_retval = Call(ty.Of(interface), 42_f, Call<vec4<f32>>());
     Func("vert_main", utils::Empty, ty.Of(interface), utils::Vector{Return(vert_retval)},
          utils::Vector{
              Stage(ast::PipelineStage::kVertex),
diff --git a/src/tint/writer/spirv/builder_function_attribute_test.cc b/src/tint/writer/spirv/builder_function_attribute_test.cc
index c47429b..2bdcc44 100644
--- a/src/tint/writer/spirv/builder_function_attribute_test.cc
+++ b/src/tint/writer/spirv/builder_function_attribute_test.cc
@@ -19,11 +19,12 @@
 #include "src/tint/writer/spirv/spv_dump.h"
 #include "src/tint/writer/spirv/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::writer::spirv {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using BuilderTest = TestHelper;
 
 TEST_F(BuilderTest, Attribute_Stage) {
@@ -61,7 +62,7 @@
     if (params.stage == ast::PipelineStage::kVertex) {
         ret_type = ty.vec4<f32>();
         ret_type_attrs.Push(Builtin(builtin::BuiltinValue::kPosition));
-        body.Push(Return(Call(ty.vec4<f32>())));
+        body.Push(Return(Call<vec4<f32>>()));
     }
 
     utils::Vector<const ast::Attribute*, 2> deco_list{Stage(params.stage)};
diff --git a/src/tint/writer/spirv/builder_function_variable_test.cc b/src/tint/writer/spirv/builder_function_variable_test.cc
index 9f77d4e..c83def6 100644
--- a/src/tint/writer/spirv/builder_function_variable_test.cc
+++ b/src/tint/writer/spirv/builder_function_variable_test.cc
@@ -15,7 +15,8 @@
 #include "src/tint/writer/spirv/spv_dump.h"
 #include "src/tint/writer/spirv/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::spirv {
 namespace {
@@ -44,7 +45,7 @@
 }
 
 TEST_F(BuilderTest, FunctionVar_WithConstantInitializer) {
-    auto* init = vec3<f32>(1_f, 1_f, 3_f);
+    auto* init = Call<vec3<f32>>(1_f, 1_f, 3_f);
     auto* v = Var("var", ty.vec3<f32>(), builtin::AddressSpace::kFunction, init);
     WrapInFunction(v);
 
@@ -74,7 +75,7 @@
 
 TEST_F(BuilderTest, FunctionVar_WithNonConstantInitializer) {
     auto* a = Let("a", Expr(3_f));
-    auto* init = vec2<f32>(1_f, Add(Expr("a"), 3_f));
+    auto* init = Call<vec2<f32>>(1_f, Add(Expr("a"), 3_f));
 
     auto* v = Var("var", ty.vec2<f32>(), init);
     WrapInFunction(a, v);
@@ -207,7 +208,7 @@
 }
 
 TEST_F(BuilderTest, FunctionVar_Let) {
-    auto* init = vec3<f32>(1_f, 1_f, 3_f);
+    auto* init = Call<vec3<f32>>(1_f, 1_f, 3_f);
 
     auto* v = Let("var", ty.vec3<f32>(), init);
 
@@ -227,7 +228,7 @@
 }
 
 TEST_F(BuilderTest, FunctionVar_Const) {
-    auto* init = vec3<f32>(1_f, 1_f, 3_f);
+    auto* init = Call<vec3<f32>>(1_f, 1_f, 3_f);
 
     auto* v = Const("var", ty.vec3<f32>(), init);
 
diff --git a/src/tint/writer/spirv/builder_global_variable_test.cc b/src/tint/writer/spirv/builder_global_variable_test.cc
index 671bacc..b921d07 100644
--- a/src/tint/writer/spirv/builder_global_variable_test.cc
+++ b/src/tint/writer/spirv/builder_global_variable_test.cc
@@ -18,7 +18,8 @@
 #include "src/tint/writer/spirv/spv_dump.h"
 #include "src/tint/writer/spirv/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::spirv {
 namespace {
@@ -41,7 +42,7 @@
 }
 
 TEST_F(BuilderTest, GlobalVar_WithInitializer) {
-    auto* init = vec3<f32>(1_f, 1_f, 3_f);
+    auto* init = Call<vec3<f32>>(1_f, 1_f, 3_f);
 
     auto* v = GlobalVar("var", ty.vec3<f32>(), builtin::AddressSpace::kPrivate, init);
 
@@ -91,7 +92,7 @@
     // const c = vec3<f32>(1f, 2f, 3f);
     // var v = c;
 
-    auto* c = GlobalConst("c", vec3<f32>(1_f, 2_f, 3_f));
+    auto* c = GlobalConst("c", Call<vec3<f32>>(1_f, 2_f, 3_f));
     GlobalVar("v", builtin::AddressSpace::kPrivate, Expr(c));
 
     spirv::Builder& b = SanitizeAndBuild();
@@ -121,7 +122,7 @@
     // var v = c;
     Enable(builtin::Extension::kF16);
 
-    auto* c = GlobalConst("c", vec3<f16>(1_h, 2_h, 3_h));
+    auto* c = GlobalConst("c", Call<vec3<f16>>(1_h, 2_h, 3_h));
     GlobalVar("v", builtin::AddressSpace::kPrivate, Expr(c));
 
     spirv::Builder& b = SanitizeAndBuild();
@@ -150,7 +151,7 @@
     // const c = vec3(1, 2, 3);
     // var v = c;
 
-    auto* c = GlobalConst("c", Call(ty.vec3<Infer>(), 1_a, 2_a, 3_a));
+    auto* c = GlobalConst("c", Call<vec3<Infer>>(1_a, 2_a, 3_a));
     GlobalVar("v", builtin::AddressSpace::kPrivate, Expr(c));
 
     spirv::Builder& b = SanitizeAndBuild();
@@ -179,7 +180,7 @@
     // const c = vec3(1.0, 2.0, 3.0);
     // var v = c;
 
-    auto* c = GlobalConst("c", Call(ty.vec3<Infer>(), 1._a, 2._a, 3._a));
+    auto* c = GlobalConst("c", Call<vec3<Infer>>(1._a, 2._a, 3._a));
     GlobalVar("v", builtin::AddressSpace::kPrivate, Expr(c));
 
     spirv::Builder& b = SanitizeAndBuild();
@@ -208,7 +209,7 @@
     // const c = vec3<f32>(vec2<f32>(1f, 2f), 3f));
     // var v = c;
 
-    auto* c = GlobalConst("c", vec3<f32>(vec2<f32>(1_f, 2_f), 3_f));
+    auto* c = GlobalConst("c", Call<vec3<f32>>(Call<vec2<f32>>(1_f, 2_f), 3_f));
     GlobalVar("v", builtin::AddressSpace::kPrivate, Expr(c));
 
     spirv::Builder& b = SanitizeAndBuild();
diff --git a/src/tint/writer/spirv/builder_ident_expression_test.cc b/src/tint/writer/spirv/builder_ident_expression_test.cc
index 5ab7c19..55a24c4 100644
--- a/src/tint/writer/spirv/builder_ident_expression_test.cc
+++ b/src/tint/writer/spirv/builder_ident_expression_test.cc
@@ -16,7 +16,8 @@
 #include "src/tint/writer/spirv/spv_dump.h"
 #include "src/tint/writer/spirv/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::spirv {
 namespace {
@@ -28,7 +29,7 @@
         {
             ProgramBuilder pb;
 
-            auto* init = pb.vec3<f32>(1_f, 1_f, 3_f);
+            auto* init = pb.Call<vec3<f32>>(1_f, 1_f, 3_f);
 
             auto* v = pb.GlobalConst("c", pb.ty.vec3<f32>(), init);
 
@@ -66,7 +67,7 @@
 }
 
 TEST_F(BuilderTest, IdentifierExpression_FunctionConst) {
-    auto* init = vec3<f32>(1_f, 1_f, 3_f);
+    auto* init = Call<vec3<f32>>(1_f, 1_f, 3_f);
 
     auto* v = Let("var", ty.vec3<f32>(), init);
 
diff --git a/src/tint/writer/spirv/builder_return_test.cc b/src/tint/writer/spirv/builder_return_test.cc
index 13a65d6..a93a276 100644
--- a/src/tint/writer/spirv/builder_return_test.cc
+++ b/src/tint/writer/spirv/builder_return_test.cc
@@ -15,7 +15,8 @@
 #include "src/tint/writer/spirv/spv_dump.h"
 #include "src/tint/writer/spirv/test_helper.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::spirv {
 namespace {
@@ -37,7 +38,7 @@
 }
 
 TEST_F(BuilderTest, Return_WithValue) {
-    auto* val = vec3<f32>(1_f, 1_f, 3_f);
+    auto* val = Call<vec3<f32>>(1_f, 1_f, 3_f);
 
     auto* ret = Return(val);
     Func("test", utils::Empty, ty.vec3<f32>(), utils::Vector{ret}, utils::Empty);
diff --git a/src/tint/writer/spirv/ir/generator_impl_ir_access_test.cc b/src/tint/writer/spirv/ir/generator_impl_ir_access_test.cc
index fa5c977..13a526f 100644
--- a/src/tint/writer/spirv/ir/generator_impl_ir_access_test.cc
+++ b/src/tint/writer/spirv/ir/generator_impl_ir_access_test.cc
@@ -14,17 +14,13 @@
 
 #include "src/tint/writer/spirv/ir/test_helper_ir.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::spirv {
 namespace {
 
-class SpvGeneratorImplTest_Access : public SpvGeneratorImplTest {
-  protected:
-    const type::Pointer* ptr(const type::Type* elem) {
-        return ty.ptr(builtin::AddressSpace::kFunction, elem, builtin::Access::kReadWrite);
-    }
-};
+using SpvGeneratorImplTest_Access = SpvGeneratorImplTest;
 
 TEST_F(SpvGeneratorImplTest_Access, Array_Value_ConstantIndex) {
     auto* arr_val = b.FunctionParam(ty.array(ty.i32(), 4));
@@ -59,8 +55,8 @@
     auto* func = b.Function("foo", ty.void_());
 
     auto sb = b.With(func->StartTarget());
-    auto* arr_var = sb.Var(ptr(ty.array(ty.i32(), 4)));
-    sb.Access(ptr(ty.i32()), arr_var, 1_u);
+    auto* arr_var = sb.Var(ty.ptr<function, array<i32, 4>>());
+    sb.Access(ty.ptr<function, i32>(), arr_var, 1_u);
     sb.Return(func);
 
     ASSERT_TRUE(IRIsValid()) << Error();
@@ -90,10 +86,10 @@
     auto* func = b.Function("foo", ty.void_());
 
     auto sb = b.With(func->StartTarget());
-    auto* idx_var = sb.Var(ptr(ty.i32()));
+    auto* idx_var = sb.Var(ty.ptr<function, i32>());
     auto* idx = sb.Load(idx_var);
-    auto* arr_var = sb.Var(ptr(ty.array(ty.i32(), 4)));
-    sb.Access(ptr(ty.i32()), arr_var, idx);
+    auto* arr_var = sb.Var(ty.ptr<function, array<i32, 4>>());
+    sb.Access(ty.ptr<function, i32>(), arr_var, idx);
     sb.Return(func);
 
     ASSERT_TRUE(IRIsValid()) << Error();
@@ -153,9 +149,9 @@
     auto* func = b.Function("foo", ty.void_());
 
     auto sb = b.With(func->StartTarget());
-    auto* mat_var = sb.Var(ptr(ty.mat2x2(ty.f32())));
-    sb.Access(ptr(ty.vec2(ty.f32())), mat_var, 1_u);
-    sb.Access(ptr(ty.f32()), mat_var, 1_u, 0_u);
+    auto* mat_var = sb.Var(ty.ptr<function, mat2x2<f32>>());
+    sb.Access(ty.ptr<function, vec2<f32>>(), mat_var, 1_u);
+    sb.Access(ty.ptr<function, f32>(), mat_var, 1_u, 0_u);
     sb.Return(func);
 
     ASSERT_TRUE(IRIsValid()) << Error();
@@ -187,11 +183,11 @@
     auto* func = b.Function("foo", ty.void_());
 
     auto sb = b.With(func->StartTarget());
-    auto* idx_var = sb.Var(ptr(ty.i32()));
+    auto* idx_var = sb.Var(ty.ptr<function, i32>());
     auto* idx = sb.Load(idx_var);
-    auto* mat_var = sb.Var(ptr(ty.mat2x2(ty.f32())));
-    sb.Access(ptr(ty.vec2(ty.f32())), mat_var, idx);
-    sb.Access(ptr(ty.f32()), mat_var, idx, idx);
+    auto* mat_var = sb.Var(ty.ptr<function, mat2x2<f32>>());
+    sb.Access(ty.ptr<function, vec2<f32>>(), mat_var, idx);
+    sb.Access(ty.ptr<function, f32>(), mat_var, idx, idx);
     sb.Return(func);
 
     ASSERT_TRUE(IRIsValid()) << Error();
@@ -252,7 +248,7 @@
     func->SetParams({vec_val});
 
     auto sb = b.With(func->StartTarget());
-    auto* idx_var = sb.Var(ptr(ty.i32()));
+    auto* idx_var = sb.Var(ty.ptr<function, i32>());
     auto* idx = sb.Load(idx_var);
     sb.Access(ty.i32(), vec_val, idx);
     sb.Return(func);
@@ -281,8 +277,8 @@
     auto* func = b.Function("foo", ty.void_());
 
     auto sb = b.With(func->StartTarget());
-    auto* vec_var = sb.Var(ptr(ty.vec4(ty.i32())));
-    sb.Access(ptr(ty.i32()), vec_var, 1_u);
+    auto* vec_var = sb.Var(ty.ptr<function, vec4<i32>>());
+    sb.Access(ty.ptr<function, i32>(), vec_var, 1_u);
     sb.Return(func);
 
     ASSERT_TRUE(IRIsValid()) << Error();
@@ -310,10 +306,10 @@
     auto* func = b.Function("foo", ty.void_());
 
     auto sb = b.With(func->StartTarget());
-    auto* idx_var = sb.Var(ptr(ty.i32()));
+    auto* idx_var = sb.Var(ty.ptr<function, i32>());
     auto* idx = sb.Load(idx_var);
-    auto* vec_var = sb.Var(ptr(ty.vec4(ty.i32())));
-    sb.Access(ptr(ty.i32()), vec_var, idx);
+    auto* vec_var = sb.Var(ty.ptr<function, vec4<i32>>());
+    sb.Access(ty.ptr<function, i32>(), vec_var, idx);
     sb.Return(func);
 
     ASSERT_TRUE(IRIsValid()) << Error();
@@ -343,7 +339,7 @@
     func->SetParams({val});
 
     auto sb = b.With(func->StartTarget());
-    auto* idx_var = sb.Var(ptr(ty.i32()));
+    auto* idx_var = sb.Var(ty.ptr<function, i32>());
     auto* idx = sb.Load(idx_var);
     sb.Access(ty.i32(), val, 1_u, 2_u, idx);
     sb.Return(func);
@@ -429,13 +425,12 @@
                                        16u, type::StructMemberAttributes{}),
         },
         16u, 32u, 32u);
-
     auto* func = b.Function("foo", ty.void_());
 
     auto sb = b.With(func->StartTarget());
-    auto* str_var = sb.Var(ptr(str));
-    sb.Access(ptr(ty.i32()), str_var, 1_u);
-    sb.Access(ptr(ty.i32()), str_var, 1_u, 2_u);
+    auto* str_var = sb.Var(ty.ptr(function, str, read_write));
+    sb.Access(ty.ptr<function, i32>(), str_var, 1_u);
+    sb.Access(ty.ptr<function, i32>(), str_var, 1_u, 2_u);
     sb.Return(func);
 
     ASSERT_TRUE(IRIsValid()) << Error();
diff --git a/src/tint/writer/spirv/ir/generator_impl_ir_var_test.cc b/src/tint/writer/spirv/ir/generator_impl_ir_var_test.cc
index 06ae700..deff321 100644
--- a/src/tint/writer/spirv/ir/generator_impl_ir_var_test.cc
+++ b/src/tint/writer/spirv/ir/generator_impl_ir_var_test.cc
@@ -15,7 +15,8 @@
 #include "src/tint/type/pointer.h"
 #include "src/tint/writer/spirv/ir/test_helper_ir.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::spirv {
 namespace {
@@ -24,7 +25,7 @@
     auto* func = b.Function("foo", ty.void_());
 
     auto sb = b.With(func->StartTarget());
-    sb.Var(ty.ptr(builtin::AddressSpace::kFunction, ty.i32(), builtin::Access::kReadWrite));
+    sb.Var(ty.ptr<function, i32>());
     sb.Return(func);
 
     ASSERT_TRUE(IRIsValid()) << Error();
@@ -47,8 +48,7 @@
     auto* func = b.Function("foo", ty.void_());
 
     auto sb = b.With(func->StartTarget());
-    auto* v =
-        sb.Var(ty.ptr(builtin::AddressSpace::kFunction, ty.i32(), builtin::Access::kReadWrite));
+    auto* v = sb.Var(ty.ptr<function, i32>());
     v->SetInitializer(b.Constant(42_i));
 
     sb.Return(func);
@@ -75,8 +75,7 @@
     auto* func = b.Function("foo", ty.void_());
 
     auto sb = b.With(func->StartTarget());
-    auto* v =
-        sb.Var(ty.ptr(builtin::AddressSpace::kFunction, ty.i32(), builtin::Access::kReadWrite));
+    auto* v = sb.Var(ty.ptr<function, i32>());
     sb.Return(func);
 
     mod.SetName(v, "myvar");
@@ -104,8 +103,7 @@
     auto* i = b.If(true);
 
     auto tb = b.With(i->True());
-    auto* v =
-        tb.Var(ty.ptr(builtin::AddressSpace::kFunction, ty.i32(), builtin::Access::kReadWrite));
+    auto* v = tb.Var(ty.ptr<function, i32>());
     v->SetInitializer(b.Constant(42_i));
     tb.ExitIf(i);
 
@@ -147,8 +145,7 @@
     auto sb = b.With(func->StartTarget());
 
     auto* store_ty = ty.i32();
-    auto* v =
-        sb.Var(ty.ptr(builtin::AddressSpace::kFunction, store_ty, builtin::Access::kReadWrite));
+    auto* v = sb.Var(ty.ptr(function, store_ty));
     sb.Load(v);
     sb.Return(func);
 
@@ -173,8 +170,7 @@
     auto* func = b.Function("foo", ty.void_());
 
     auto sb = b.With(func->StartTarget());
-    auto* v =
-        sb.Var(ty.ptr(builtin::AddressSpace::kFunction, ty.i32(), builtin::Access::kReadWrite));
+    auto* v = sb.Var(ty.ptr<function, i32>());
     sb.Store(v, 42_i);
     sb.Return(func);
 
@@ -197,8 +193,7 @@
 }
 
 TEST_F(SpvGeneratorImplTest, PrivateVar_NoInit) {
-    b.RootBlock()->Append(
-        b.Var(ty.ptr(builtin::AddressSpace::kPrivate, ty.i32(), builtin::Access::kReadWrite)));
+    b.RootBlock()->Append(b.Var(ty.ptr<private_, i32>()));
 
     ASSERT_TRUE(generator_.Generate()) << generator_.Diagnostics().str();
     EXPECT_EQ(DumpModule(generator_.Module()), R"(OpCapability Shader
@@ -219,7 +214,7 @@
 }
 
 TEST_F(SpvGeneratorImplTest, PrivateVar_WithInit) {
-    auto* v = b.Var(ty.ptr(builtin::AddressSpace::kPrivate, ty.i32(), builtin::Access::kReadWrite));
+    auto* v = b.Var(ty.ptr<private_, i32>());
     v->SetInitializer(b.Constant(42_i));
     b.RootBlock()->Append(v);
 
@@ -243,7 +238,7 @@
 }
 
 TEST_F(SpvGeneratorImplTest, PrivateVar_Name) {
-    auto* v = b.Var(ty.ptr(builtin::AddressSpace::kPrivate, ty.i32(), builtin::Access::kReadWrite));
+    auto* v = b.Var(ty.ptr<private_, i32>());
     v->SetInitializer(b.Constant(42_i));
     b.RootBlock()->Append(v);
 
@@ -274,7 +269,7 @@
     mod.functions.Push(func);
 
     auto* store_ty = ty.i32();
-    auto* v = b.Var(ty.ptr(builtin::AddressSpace::kPrivate, store_ty, builtin::Access::kReadWrite));
+    auto* v = b.Var(ty.ptr(private_, store_ty));
     v->SetInitializer(b.Constant(42_i));
     b.RootBlock()->Append(v);
 
@@ -308,8 +303,7 @@
 }
 
 TEST_F(SpvGeneratorImplTest, WorkgroupVar) {
-    b.RootBlock()->Append(
-        b.Var(ty.ptr(builtin::AddressSpace::kWorkgroup, ty.i32(), builtin::Access::kReadWrite)));
+    b.RootBlock()->Append(b.Var(ty.ptr<workgroup, i32>()));
 
     ASSERT_TRUE(generator_.Generate()) << generator_.Diagnostics().str();
     EXPECT_EQ(DumpModule(generator_.Module()), R"(OpCapability Shader
@@ -330,8 +324,7 @@
 }
 
 TEST_F(SpvGeneratorImplTest, WorkgroupVar_Name) {
-    auto* v = b.RootBlock()->Append(
-        b.Var(ty.ptr(builtin::AddressSpace::kWorkgroup, ty.i32(), builtin::Access::kReadWrite)));
+    auto* v = b.RootBlock()->Append(b.Var(ty.ptr<workgroup, i32>()));
     mod.SetName(v, "myvar");
 
     ASSERT_TRUE(generator_.Generate()) << generator_.Diagnostics().str();
@@ -359,8 +352,7 @@
     mod.functions.Push(func);
 
     auto* store_ty = ty.i32();
-    auto* v = b.RootBlock()->Append(
-        b.Var(ty.ptr(builtin::AddressSpace::kWorkgroup, store_ty, builtin::Access::kReadWrite)));
+    auto* v = b.RootBlock()->Append(b.Var(ty.ptr(workgroup, store_ty)));
 
     auto sb = b.With(func->StartTarget());
     sb.Load(v);
@@ -391,8 +383,7 @@
 }
 
 TEST_F(SpvGeneratorImplTest, WorkgroupVar_ZeroInitializeWithExtension) {
-    b.RootBlock()->Append(
-        b.Var(ty.ptr(builtin::AddressSpace::kWorkgroup, ty.i32(), builtin::Access::kReadWrite)));
+    b.RootBlock()->Append(b.Var(ty.ptr<workgroup, i32>()));
 
     // Create a generator with the zero_init_workgroup_memory flag set to `true`.
     spirv::GeneratorImplIr gen(&mod, true);
@@ -416,7 +407,7 @@
 }
 
 TEST_F(SpvGeneratorImplTest, StorageVar) {
-    auto* v = b.Var(ty.ptr(builtin::AddressSpace::kStorage, ty.i32(), builtin::Access::kReadWrite));
+    auto* v = b.Var(ty.ptr<storage, i32>());
     v->SetBindingPoint(0, 0);
     b.RootBlock()->Append(v);
 
@@ -446,7 +437,7 @@
 }
 
 TEST_F(SpvGeneratorImplTest, StorageVar_Name) {
-    auto* v = b.Var(ty.ptr(builtin::AddressSpace::kStorage, ty.i32(), builtin::Access::kReadWrite));
+    auto* v = b.Var(ty.ptr<storage, i32>());
     v->SetBindingPoint(0, 0);
     b.RootBlock()->Append(v);
     mod.SetName(v, "myvar");
@@ -477,7 +468,7 @@
 }
 
 TEST_F(SpvGeneratorImplTest, StorageVar_LoadAndStore) {
-    auto* v = b.Var(ty.ptr(builtin::AddressSpace::kStorage, ty.i32(), builtin::Access::kReadWrite));
+    auto* v = b.Var(ty.ptr<storage, i32>());
     v->SetBindingPoint(0, 0);
     b.RootBlock()->Append(v);
 
@@ -527,7 +518,7 @@
 }
 
 TEST_F(SpvGeneratorImplTest, UniformVar) {
-    auto* v = b.Var(ty.ptr(builtin::AddressSpace::kUniform, ty.i32(), builtin::Access::kReadWrite));
+    auto* v = b.Var(ty.ptr<uniform, i32>());
     v->SetBindingPoint(0, 0);
     b.RootBlock()->Append(v);
 
@@ -557,7 +548,7 @@
 }
 
 TEST_F(SpvGeneratorImplTest, UniformVar_Name) {
-    auto* v = b.Var(ty.ptr(builtin::AddressSpace::kUniform, ty.i32(), builtin::Access::kReadWrite));
+    auto* v = b.Var(ty.ptr<uniform, i32>());
     v->SetBindingPoint(0, 0);
     b.RootBlock()->Append(v);
     mod.SetName(v, "myvar");
@@ -588,7 +579,7 @@
 }
 
 TEST_F(SpvGeneratorImplTest, UniformVar_Load) {
-    auto* v = b.Var(ty.ptr(builtin::AddressSpace::kUniform, ty.i32(), builtin::Access::kReadWrite));
+    auto* v = b.Var(ty.ptr<uniform, i32>());
     v->SetBindingPoint(0, 0);
     b.RootBlock()->Append(v);
 
diff --git a/src/tint/writer/spirv/scalar_constant.h b/src/tint/writer/spirv/scalar_constant.h
index dd4dfd0..7d79dab 100644
--- a/src/tint/writer/spirv/scalar_constant.h
+++ b/src/tint/writer/spirv/scalar_constant.h
@@ -20,7 +20,7 @@
 #include <cstring>
 #include <functional>
 
-#include "src/tint/number.h"
+#include "src/tint/builtin/number.h"
 #include "src/tint/utils/hash.h"
 
 // Forward declarations
diff --git a/src/tint/writer/wgsl/generator_impl_cast_test.cc b/src/tint/writer/wgsl/generator_impl_cast_test.cc
index 890c52c..27c4546 100644
--- a/src/tint/writer/wgsl/generator_impl_cast_test.cc
+++ b/src/tint/writer/wgsl/generator_impl_cast_test.cc
@@ -17,7 +17,8 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::wgsl {
 namespace {
@@ -51,7 +52,7 @@
 }
 
 TEST_F(WgslGeneratorImplTest, EmitExpression_Cast_Vector_F32_From_I32) {
-    auto* cast = vec3<f32>(vec3<i32>(1_i, 2_i, 3_i));
+    auto* cast = Call<vec3<f32>>(Call<vec3<i32>>(1_i, 2_i, 3_i));
     WrapInFunction(cast);
 
     GeneratorImpl& gen = Build();
@@ -65,7 +66,7 @@
 TEST_F(WgslGeneratorImplTest, EmitExpression_Cast_Vector_F16_From_I32) {
     Enable(builtin::Extension::kF16);
 
-    auto* cast = vec3<f16>(vec3<i32>(1_i, 2_i, 3_i));
+    auto* cast = Call<vec3<f16>>(Call<vec3<i32>>(1_i, 2_i, 3_i));
     WrapInFunction(cast);
 
     GeneratorImpl& gen = Build();
diff --git a/src/tint/writer/wgsl/generator_impl_constructor_test.cc b/src/tint/writer/wgsl/generator_impl_constructor_test.cc
index fa40ff6..e360be2 100644
--- a/src/tint/writer/wgsl/generator_impl_constructor_test.cc
+++ b/src/tint/writer/wgsl/generator_impl_constructor_test.cc
@@ -18,11 +18,12 @@
 
 using ::testing::HasSubstr;
 
-using namespace tint::number_suffixes;  // NOLINT
-
 namespace tint::writer::wgsl {
 namespace {
 
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
+
 using WgslGeneratorImplTest_Constructor = TestHelper;
 
 TEST_F(WgslGeneratorImplTest_Constructor, Bool) {
@@ -129,7 +130,7 @@
 }
 
 TEST_F(WgslGeneratorImplTest_Constructor, Type_Vec_F32) {
-    WrapInFunction(vec3<f32>(1_f, 2_f, 3_f));
+    WrapInFunction(Call<vec3<f32>>(1_f, 2_f, 3_f));
 
     GeneratorImpl& gen = Build();
 
@@ -141,7 +142,7 @@
 TEST_F(WgslGeneratorImplTest_Constructor, Type_Vec_F16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(vec3<f16>(1_h, 2_h, 3_h));
+    WrapInFunction(Call<vec3<f16>>(1_h, 2_h, 3_h));
 
     GeneratorImpl& gen = Build();
 
@@ -151,7 +152,8 @@
 }
 
 TEST_F(WgslGeneratorImplTest_Constructor, Type_Mat_F32) {
-    WrapInFunction(mat2x3<f32>(vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(3_f, 4_f, 5_f)));
+    WrapInFunction(
+        Call<mat2x3<f32>>(Call<vec3<f32>>(1_f, 2_f, 3_f), Call<vec3<f32>>(3_f, 4_f, 5_f)));
 
     GeneratorImpl& gen = Build();
 
@@ -164,7 +166,8 @@
 TEST_F(WgslGeneratorImplTest_Constructor, Type_Mat_F16) {
     Enable(builtin::Extension::kF16);
 
-    WrapInFunction(mat2x3<f16>(vec3<f16>(1_h, 2_h, 3_h), vec3<f16>(3_h, 4_h, 5_h)));
+    WrapInFunction(
+        Call<mat2x3<f16>>(Call<vec3<f16>>(1_h, 2_h, 3_h), Call<vec3<f16>>(3_h, 4_h, 5_h)));
 
     GeneratorImpl& gen = Build();
 
@@ -175,8 +178,8 @@
 }
 
 TEST_F(WgslGeneratorImplTest_Constructor, Type_Array) {
-    WrapInFunction(Call(ty.array(ty.vec3<f32>(), 3_u), vec3<f32>(1_f, 2_f, 3_f),
-                        vec3<f32>(4_f, 5_f, 6_f), vec3<f32>(7_f, 8_f, 9_f)));
+    WrapInFunction(Call(ty.array<vec3<f32>, 3>(), Call<vec3<f32>>(1_f, 2_f, 3_f),
+                        Call<vec3<f32>>(4_f, 5_f, 6_f), Call<vec3<f32>>(7_f, 8_f, 9_f)));
 
     GeneratorImpl& gen = Build();
 
@@ -188,8 +191,8 @@
 }
 
 TEST_F(WgslGeneratorImplTest_Constructor, Type_ImplicitArray) {
-    WrapInFunction(Call(ty.array<Infer>(), vec3<f32>(1_f, 2_f, 3_f), vec3<f32>(4_f, 5_f, 6_f),
-                        vec3<f32>(7_f, 8_f, 9_f)));
+    WrapInFunction(Call(ty.array<Infer>(), Call<vec3<f32>>(1_f, 2_f, 3_f),
+                        Call<vec3<f32>>(4_f, 5_f, 6_f), Call<vec3<f32>>(7_f, 8_f, 9_f)));
 
     GeneratorImpl& gen = Build();
 
diff --git a/src/tint/writer/wgsl/generator_impl_type_test.cc b/src/tint/writer/wgsl/generator_impl_type_test.cc
index cb790cb..835f353 100644
--- a/src/tint/writer/wgsl/generator_impl_type_test.cc
+++ b/src/tint/writer/wgsl/generator_impl_type_test.cc
@@ -22,7 +22,8 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::wgsl {
 namespace {
@@ -146,7 +147,7 @@
 }
 
 TEST_F(WgslGeneratorImplTest, EmitType_Pointer) {
-    auto type = Alias("make_type_reachable", ty.ptr<f32>(builtin::AddressSpace::kWorkgroup))->type;
+    auto type = Alias("make_type_reachable", ty.ptr<workgroup, f32>())->type;
 
     GeneratorImpl& gen = Build();
 
@@ -157,9 +158,7 @@
 }
 
 TEST_F(WgslGeneratorImplTest, EmitType_PointerAccessMode) {
-    auto type = Alias("make_type_reachable",
-                      ty.ptr<f32>(builtin::AddressSpace::kStorage, builtin::Access::kReadWrite))
-                    ->type;
+    auto type = Alias("make_type_reachable", ty.ptr<storage, f32, read_write>())->type;
 
     GeneratorImpl& gen = Build();
 
diff --git a/src/tint/writer/wgsl/generator_impl_variable_decl_statement_test.cc b/src/tint/writer/wgsl/generator_impl_variable_decl_statement_test.cc
index 59d761e..78a4e3c 100644
--- a/src/tint/writer/wgsl/generator_impl_variable_decl_statement_test.cc
+++ b/src/tint/writer/wgsl/generator_impl_variable_decl_statement_test.cc
@@ -17,7 +17,8 @@
 
 #include "gmock/gmock.h"
 
-using namespace tint::number_suffixes;  // NOLINT
+using namespace tint::builtin::fluent_types;  // NOLINT
+using namespace tint::number_suffixes;        // NOLINT
 
 namespace tint::writer::wgsl {
 namespace {
@@ -167,7 +168,7 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_VariableDeclStatement_Const_vec3_AInt) {
-    auto* C = Const("C", Call(ty.vec3<Infer>(), 1_a, 2_a, 3_a));
+    auto* C = Const("C", Call<vec3<Infer>>(1_a, 2_a, 3_a));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -185,7 +186,7 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_VariableDeclStatement_Const_vec3_AFloat) {
-    auto* C = Const("C", Call(ty.vec3<Infer>(), 1._a, 2._a, 3._a));
+    auto* C = Const("C", Call<vec3<Infer>>(1._a, 2._a, 3._a));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -203,7 +204,7 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_VariableDeclStatement_Const_vec3_f32) {
-    auto* C = Const("C", vec3<f32>(1_f, 2_f, 3_f));
+    auto* C = Const("C", Call<vec3<f32>>(1_f, 2_f, 3_f));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -223,7 +224,7 @@
 TEST_F(WgslGeneratorImplTest, Emit_VariableDeclStatement_Const_vec3_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* C = Const("C", vec3<f16>(1_h, 2_h, 3_h));
+    auto* C = Const("C", Call<vec3<f16>>(1_h, 2_h, 3_h));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -243,7 +244,7 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_VariableDeclStatement_Const_mat2x3_AFloat) {
-    auto* C = Const("C", Call(ty.mat2x3<Infer>(), 1._a, 2._a, 3._a, 4._a, 5._a, 6._a));
+    auto* C = Const("C", Call<mat2x3<Infer>>(1._a, 2._a, 3._a, 4._a, 5._a, 6._a));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -261,7 +262,7 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_VariableDeclStatement_Const_mat2x3_f32) {
-    auto* C = Const("C", mat2x3<f32>(1_f, 2_f, 3_f, 4_f, 5_f, 6_f));
+    auto* C = Const("C", Call<mat2x3<f32>>(1_f, 2_f, 3_f, 4_f, 5_f, 6_f));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -281,7 +282,7 @@
 TEST_F(WgslGeneratorImplTest, Emit_VariableDeclStatement_Const_mat2x3_f16) {
     Enable(builtin::Extension::kF16);
 
-    auto* C = Const("C", mat2x3<f16>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
+    auto* C = Const("C", Call<mat2x3<f16>>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -301,7 +302,7 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_VariableDeclStatement_Const_arr_f32) {
-    auto* C = Const("C", array<f32, 3>(1_f, 2_f, 3_f));
+    auto* C = Const("C", Call<array<f32, 3>>(1_f, 2_f, 3_f));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
@@ -319,10 +320,10 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_VariableDeclStatement_Const_arr_vec2_bool) {
-    auto* C = Const("C", Call(ty.array(ty.vec2<bool>(), 3_u),  //
-                              vec2<bool>(true, false),         //
-                              vec2<bool>(false, true),         //
-                              vec2<bool>(true, true)));
+    auto* C = Const("C", Call<array<vec2<bool>, 3>>(         //
+                             Call<vec2<bool>>(true, false),  //
+                             Call<vec2<bool>>(false, true),  //
+                             Call<vec2<bool>>(true, true)));
     Func("f", utils::Empty, ty.void_(),
          utils::Vector{
              Decl(C),
