I'm pretty sure it's not already a TypeTuple, it's just the single enum member.

TypeTuple isn't a no-op. In this case it wraps the single enum member in a tuple, allowing it to be iterated over:

enum A { a }
pragma(msg, TypeTuple!(A.a));  //tuple(cast(A)0)
pragma(msg, A.a);                    //cast(A)0

foreach(mem, TypeTuple!(A.a)){} //allowed
foreach(mem, A.a){}                   //not allowed