The Sentinel 2 L1C images started out as 12-bit, but that has been changed in early 2016 when ESA changed QUANTIFICATION_VALUE from 1000 to 10000. Now L1C is encoded as an
UINT16 jp2 file with (at least?) 15 significant bits. This is from
gdalinfo on a recent
Band 1 Block=1024x1024 Type=UInt16, ColorInterp=Gray
Overviews: 5490x5490, 2745x2745, 1372x1372, 686x686
Image Structure Metadata:
Taking this into account, the limit seems to be 32767 rather than 65535. Any JPEG2000 reader will return the sample value as two bytes, so any code that expects a 16 bit image is safe even if NBITS changes to 16 in the future.
Another note - the product metadata.xml that comes with all L1C tiles contains info about special NO_DATA and SATURATED values, which in recent products looks like this:
The SATURATED value of 65535 indicates that the intent was indeed to use the full range of uint16.
As for L2A, there are (at least) two sources of values higher-than 10000:
L2A data is proportional to surface reflectance, which is proportional to the light reflected from a pixel divided by the amount of light falling onto a flat surface covered by that pixel. Some slopes will receive more light than the denominator in this computation, therefore some bright sun-facing slopes may get L2A values much higher than 10000;
the algorithm does not ideally correct all specular reflections, DEM misregistration, emmited radiation and other causes of higher-than-100% reflectance
Most values on flat surfaces for L2A will be in the range of 0..10000, but you can expect some values to be outside this range, up to 65534, with 65535 again reserved for SATURATED pixels.
EDIT (thanks to @o-hagolle) more accurate description of L2A range.