Doubles.constrainToRange(double,double,double) and Floats.constrainToRange(float,float,float) both cause unnecessary boxing of their arguments. Both call Preconditions.checkArgument(boolean, String, **Object**, **Object**) which causes the boxing.

Can be easily fixed by introducing an overloaded version of checkArgument for floats and doubles. For ints and longs these versions already exist:
Preconditions.checkArgument(boolean, String, **int**, **int**)
Preconditions.checkArgument(boolean, String, **long**, **long**)
which is also why constrainToRange does not have the same problem in the Ints, Shorts & Longs packages.
@Weak final Multimap<K, V> multimap;
    Keys(Multimap<K, V> multimap) {
      this.multimap = multimap;
    }
    @Override
    Iterator<Multiset.Entry<K>> entryIterator() {
      return new TransformedIterator<Map.Entry<K, Collection<V>>, Multiset.Entry<K>>(
          multimap.asMap().entrySet().iterator()) {
        @Override
        Multiset.Entry<K> transform(final Map.Entry<K, Collection<V>> backingEntry) {
          return new Multisets.AbstractEntry<K>() {
            @Override
            public K getElement() {
              return backingEntry.getKey();
            }
            @Override
            public int getCount() {
              return backingEntry.getValue().size();
            }
          };
        }
      };
    }
    @Override
    public Spliterator<K> spliterator() {
      return CollectSpliterators.map(multimap.entries().spliterator(), Map.Entry::getKey);
    }
    @Override
    public void forEach(Consumer<? super K> consumer) {
      checkNotNull(consumer);