Qual método você acha que é chamado se passarmos um int [] ?
public void fly(int[] lengths) { }
public void fly(int... lengths) { } // DOES NOT COMPILE
Truque de pergunta! Lembre-se de que o Java trata varargs como se fossem uma matriz. Isso significa que a assinatura do método é a mesma para os dois métodos. Como não temos permissão para métodos de carregamento com a mesma lista de parâmetros, esse código não é compilado. Mesmo que o código não parece o mesmo, ele é compilado na mesma lista de parâmetros.
Agora que acabamos de explicar que eles são iguais, é hora de mencionar: como eles não são os mesmos. Não deve ser surpresa que você possa chamar qualquer um dos métodos passando uma matriz:
fly(new int[] { 1, 2, 3 });
No entanto, você pode chamar apenas a versão varargs com parâmetros independentes:
fly(1, 2, 3);