Em vez disso, eu acho mais simples assim:
if (nome.equalsIgnoreCase(nomes[i]))
Não só porque fica mais sucinto e - na minha opinião - mais legível, mas também porque acaba sendo mais otimizado.
Ao chamar toLowerCase(), vc acaba gerando uma nova string (então nesse caso, são geradas duas strings), e só depois começa a ser feita a comparação entre elas. Já equalsIgnoreCase começa fazendo a comparação caractere a caractere, e já retorna false assim que encontra alguma diferença (e se não encontrar, ainda sim é melhor porque não precisou gerar strings extras).
Claro que para códigos com poucas comparações, a diferença será irrelevante, mas ainda sim, eu prefiro usar equalsIgnoreCase. Até porque tem outros casos em que pode dar diferença. Ex:
String s1 = "I";
String s2 = "İ";
System.out.println(s1.toLowerCase().equals(s2.toLowerCase())); // false
System.out.println(s1.equalsIgnoreCase(s2)); // true
No caso, a string s1 tem o caractere I (a letra “i” maiúscula), mas s2 tem o caractere İ (é uma letra “i” com um “pinguinho” em cima), que é outro caractere, diferente do “I” maiúsculo.
Apesar disso, equalsIgnoreCase considera que são iguais, por motivos de “Unicode contém várias dessas bizarrices” 
Se quiser saber porque dá diferença, é porque a versão lowercase delas de fato é diferente. Basta imprimir os code points de cada uma:
String s1 = "I";
String s2 = "İ";
System.out.println("s1:");
s1.toLowerCase().codePoints().forEach(c -> System.out.printf("%06X\n", c));
System.out.println("s2:");
s2.toLowerCase().codePoints().forEach(c -> System.out.printf("%06X\n", c));
A saída é:
s1:
000069
s2:
000069
000307
Isso mesmo, s2.toLowerCase() retorna uma string com dois code points (inclusive, s2.toLowerCase().length() é 2).
E esse não é o único caso, letras gregas como ϴ e ϑ também dão o mesmo resultado (equals com toLowerCase retorna false, mas equalsIgnoreCase retorna true).
Claro que se tiver apenas textos em português, esses problemas não ocorrem. Mas ainda sim, usar equalsIgnoreCase, além de deixar - na minha opinião - mais claro e sucinto, ainda evita criar duas strings à toa (e na verdade vai criar bem mais, já que isso está dentro de um loop).