diff --git a/cue/ast/ast.go b/cue/ast/ast.go
index 95cc0ce..a7c99a9 100644
--- a/cue/ast/ast.go
+++ b/cue/ast/ast.go
@@ -414,18 +414,6 @@
 	expr
 }
 
-// A TemplateLabel represents a field template declaration in a struct.
-//
-// Deprecated: use square bracket notation through ListLit.
-type TemplateLabel struct {
-	Langle token.Pos
-	Ident  *Ident
-	Rangle token.Pos
-
-	comments
-	label
-}
-
 // A BasicLit node represents a literal of basic type.
 type BasicLit struct {
 	ValuePos token.Pos   // literal position
@@ -770,8 +758,6 @@
 func (x *BadExpr) pos() *token.Pos       { return &x.From }
 func (x *Ident) Pos() token.Pos          { return x.NamePos }
 func (x *Ident) pos() *token.Pos         { return &x.NamePos }
-func (x *TemplateLabel) Pos() token.Pos  { return x.Langle }
-func (x *TemplateLabel) pos() *token.Pos { return &x.Langle }
 func (x *BasicLit) Pos() token.Pos       { return x.ValuePos }
 func (x *BasicLit) pos() *token.Pos      { return &x.ValuePos }
 func (x *Interpolation) Pos() token.Pos  { return x.Elts[0].Pos() }
@@ -817,8 +803,7 @@
 func (x *Ident) End() token.Pos {
 	return x.NamePos.Add(len(x.Name))
 }
-func (x *TemplateLabel) End() token.Pos { return x.Rangle }
-func (x *BasicLit) End() token.Pos      { return x.ValuePos.Add(len(x.Value)) }
+func (x *BasicLit) End() token.Pos { return x.ValuePos.Add(len(x.Value)) }
 
 func (x *Interpolation) End() token.Pos { return x.Elts[len(x.Elts)-1].Pos() }
 func (x *StructLit) End() token.Pos {
diff --git a/cue/ast/astutil/apply.go b/cue/ast/astutil/apply.go
index 8da54fa..58e0fce 100644
--- a/cue/ast/astutil/apply.go
+++ b/cue/ast/astutil/apply.go
@@ -350,9 +350,6 @@
 	case *ast.BottomLit, *ast.BadExpr, *ast.Ident, *ast.BasicLit:
 		// nothing to do
 
-	case *ast.TemplateLabel:
-		apply(v, c, &n.Ident)
-
 	case *ast.Interpolation:
 		applyExprList(v, c, &n, n.Elts)
 
diff --git a/cue/ast/astutil/resolve.go b/cue/ast/astutil/resolve.go
index 68155e4..b1081b0 100644
--- a/cue/ast/astutil/resolve.go
+++ b/cue/ast/astutil/resolve.go
@@ -334,13 +334,6 @@
 				}
 			})
 			walk(s, expr)
-
-		case *ast.TemplateLabel:
-			s = newScope(s.file, s, x, nil)
-			name, err := ast.ParseIdent(label.Ident)
-			if err == nil {
-				s.insert(name, x.Label, x) // Field used for entire lambda.
-			}
 		}
 
 		if n := x.Value; n != nil {
diff --git a/cue/ast/astutil/walk.go b/cue/ast/astutil/walk.go
index 269e371..a3e0249 100644
--- a/cue/ast/astutil/walk.go
+++ b/cue/ast/astutil/walk.go
@@ -95,9 +95,6 @@
 	case *ast.BottomLit, *ast.BadExpr, *ast.Ident, *ast.BasicLit:
 		// nothing to do
 
-	case *ast.TemplateLabel:
-		walk(v, n.Ident)
-
 	case *ast.Interpolation:
 		for _, e := range n.Elts {
 			walk(v, e)
diff --git a/cue/ast/walk.go b/cue/ast/walk.go
index 659d6c4..a0f81fd 100644
--- a/cue/ast/walk.go
+++ b/cue/ast/walk.go
@@ -100,9 +100,6 @@
 	case *BottomLit, *BadExpr, *Ident, *BasicLit:
 		// nothing to do
 
-	case *TemplateLabel:
-		walk(v, n.Ident)
-
 	case *Interpolation:
 		for _, e := range n.Elts {
 			walk(v, e)
diff --git a/cue/format/node.go b/cue/format/node.go
index bbc6e02..697d538 100644
--- a/cue/format/node.go
+++ b/cue/format/node.go
@@ -485,11 +485,6 @@
 		}
 		f.print(n.ValuePos, str)
 
-	case *ast.TemplateLabel:
-		f.print(n.Langle, token.LSS, indent)
-		f.label(n.Ident, false)
-		f.print(unindent, n.Rangle, token.GTR)
-
 	case *ast.ListLit:
 		f.expr(n)
 
diff --git a/internal/astinternal/debugstr.go b/internal/astinternal/debugstr.go
index c67b392..b305969 100644
--- a/internal/astinternal/debugstr.go
+++ b/internal/astinternal/debugstr.go
@@ -158,12 +158,6 @@
 	case *ast.Ident:
 		return v.Name
 
-	case *ast.TemplateLabel:
-		out := "<"
-		out += DebugStr(v.Ident)
-		out += ">"
-		return out
-
 	case *ast.SelectorExpr:
 		return DebugStr(v.X) + "." + DebugStr(v.Sel)
 
diff --git a/tools/fix/fix.go b/tools/fix/fix.go
index 1e814fb..2fbbb43 100644
--- a/tools/fix/fix.go
+++ b/tools/fix/fix.go
@@ -150,26 +150,6 @@
 		}
 	}
 
-	// Rewrite TemplateLabel to ListLit.
-	// Note: there is a chance that the name will clash with the
-	// scope in which it is defined. We drop the alias if it is not
-	// used to mitigate this issue.
-	f = astutil.Apply(f, func(c astutil.Cursor) bool {
-		n := c.Node()
-		switch x := n.(type) {
-		case *ast.TemplateLabel:
-			var expr ast.Expr = ast.NewIdent("string")
-			if _, ok := referred[x]; ok {
-				expr = &ast.Alias{
-					Ident: x.Ident,
-					Expr:  ast.NewIdent("_"),
-				}
-			}
-			c.Replace(ast.NewList(expr))
-		}
-		return true
-	}, nil).(*ast.File)
-
 	// Rewrite quoted identifier fields that are referenced.
 	f = astutil.Apply(f, func(c astutil.Cursor) bool {
 		n := c.Node()
