La questione non è tanto relativa alla espressione regolare (confermo che è corretta) ma nel come la si usa. Quella espressione regolare, tradotta a parole, vuol solo dire "una sequenza di esattamente 16 cifre numeriche".
Prendiamo una stringa in input "abc0123456789012345def". Si può usare quella regex? Beh sì ma dipende come! Una cosa è cercare una occorrenza di quella regex nella stringa e un'altra cosa è controllare che l'intera sequenza in input corrisponda esattamente alla regex.
matches() di String si comporta in quest'ultimo modo: verifica che l'intera stringa corrisponda alla regex. Con la stringa sopra, restituirebbe false.