O MySQL suporta duas variantes de maiúsculas e minúsculas, a que você usa na consulta 2 é menos flexível, mas suporta apenas igualdade em uma única variável. A outra versão não especifica nenhuma variável após o caso e as condições não precisam ser apenas igualdade:
select id_tag,
case
when tag LIKE "%class%" then "class"
when tag LIKE "%new%" then "new"
when tag LIKE "%pack%" then "pack"
end as matching_tag
from Tags
where tag LIKE "%class%" OR tag LIKE "%new%" OR tag LIKE "%pack%"
Consulte a documentação para mais detalhes
EDIT:Aqui está um pouco mais de explicação sobre por que sua consulta nº 1 retornou o que retornou:
case tag
when tag LIKE "%class%" then "class"
when tag LIKE "%new%" then "new"
when tag LIKE "%pack%" then "pack"
end as matching_tag
espera obter um valor literal para comparação entre
when ... then
No caso acima as expressões tag LIKE "%class%"
, tag LIKE "%new%"
e tag LIKE "%pack%"
são todos avaliados antes da comparação de caso real. No entanto (!), o que acontece é que eles se tornam 0 ou 1 e quando comparados com o valor da tag é o primeiro valor de 0 que corresponderá a qualquer char (char será convertido para 0) - isso é consistente com os resultados da sua primeira consulta. Aqui está uma consulta que mostra os valores lógicos para as expressões relevantes:
select id_tag, tag LIKE "%class%", tag LIKE "%new%", tag = 0, case tag when tag LIKE "%class%" then "class" when tag LIKE "%new%" then "new" when tag LIKE "%pack%" then "pack" end as matching_tag from Tags where tag LIKE "%class%" OR tag LIKE "%new%" OR tag LIKE "%pack%";
É por isso que você obtém resultados inesperados; o CAST silencioso é uma armadilha padrão aqui.