diff --git a/src/Lucene.Net/Search/FieldCacheImpl.cs b/src/Lucene.Net/Search/FieldCacheImpl.cs
index f5bb0dd..08d933a 100644
--- a/src/Lucene.Net/Search/FieldCacheImpl.cs
+++ b/src/Lucene.Net/Search/FieldCacheImpl.cs
@@ -589,7 +589,7 @@
             {
                 // Not cached here by FieldCacheImpl (cached instead
                 // per-thread by SegmentReader):
-                return new FieldCache_BytesAnonymousInnerClassHelper(this, valuesIn);
+                return new FieldCache.Bytes(get: (docID) => (byte)valuesIn.Get(docID));
             }
             else
             {
@@ -613,24 +613,6 @@
             }
         }
 
-        private class FieldCache_BytesAnonymousInnerClassHelper : FieldCache.Bytes
-        {
-            private readonly FieldCacheImpl outerInstance;
-
-            private NumericDocValues valuesIn;
-
-            public FieldCache_BytesAnonymousInnerClassHelper(FieldCacheImpl outerInstance, NumericDocValues valuesIn)
-            {
-                this.outerInstance = outerInstance;
-                this.valuesIn = valuesIn;
-            }
-
-            public override byte Get(int docID)
-            {
-                return (byte)valuesIn.Get(docID);
-            }
-        }
-
         internal class BytesFromArray : FieldCache.Bytes
         {
             private readonly sbyte[] values;
@@ -765,7 +747,7 @@
             {
                 // Not cached here by FieldCacheImpl (cached instead
                 // per-thread by SegmentReader):
-                return new FieldCache_Int16sAnonymousInnerClassHelper(this, valuesIn);
+                return new FieldCache.Int16s(get: (docID) => (short)valuesIn.Get(docID));
             }
             else
             {
@@ -787,24 +769,6 @@
             }
         }
 
-        private class FieldCache_Int16sAnonymousInnerClassHelper : FieldCache.Int16s
-        {
-            private readonly FieldCacheImpl outerInstance;
-
-            private NumericDocValues valuesIn;
-
-            public FieldCache_Int16sAnonymousInnerClassHelper(FieldCacheImpl outerInstance, NumericDocValues valuesIn)
-            {
-                this.outerInstance = outerInstance;
-                this.valuesIn = valuesIn;
-            }
-
-            public override short Get(int docID)
-            {
-                return (short)valuesIn.Get(docID);
-            }
-        }
-
         /// <summary>
         /// NOTE: This was ShortsFromArray in Lucene
         /// </summary>
@@ -943,7 +907,7 @@
             {
                 // Not cached here by FieldCacheImpl (cached instead
                 // per-thread by SegmentReader):
-                return new FieldCache_Int32sAnonymousInnerClassHelper(this, valuesIn);
+                return new FieldCache.Int32s(get: (docID) => (int)valuesIn.Get(docID));
             }
             else
             {
@@ -965,24 +929,6 @@
             }
         }
 
-        private class FieldCache_Int32sAnonymousInnerClassHelper : FieldCache.Int32s
-        {
-            private readonly FieldCacheImpl outerInstance;
-
-            private NumericDocValues valuesIn;
-
-            public FieldCache_Int32sAnonymousInnerClassHelper(FieldCacheImpl outerInstance, NumericDocValues valuesIn)
-            {
-                this.outerInstance = outerInstance;
-                this.valuesIn = valuesIn;
-            }
-
-            public override int Get(int docID)
-            {
-                return (int)valuesIn.Get(docID);
-            }
-        }
-
         /// <summary>
         /// NOTE: This was IntsFromArray in Lucene
         /// </summary>
@@ -1244,7 +1190,7 @@
             {
                 // Not cached here by FieldCacheImpl (cached instead
                 // per-thread by SegmentReader):
-                return new FieldCache_SinglesAnonymousInnerClassHelper(this, valuesIn);
+                return new FieldCache.Singles(get: (docID) => J2N.BitConversion.Int32BitsToSingle((int)valuesIn.Get(docID)));
             }
             else
             {
@@ -1266,24 +1212,6 @@
             }
         }
 
-        private class FieldCache_SinglesAnonymousInnerClassHelper : FieldCache.Singles
-        {
-            private readonly FieldCacheImpl outerInstance;
-
-            private NumericDocValues valuesIn;
-
-            public FieldCache_SinglesAnonymousInnerClassHelper(FieldCacheImpl outerInstance, NumericDocValues valuesIn)
-            {
-                this.outerInstance = outerInstance;
-                this.valuesIn = valuesIn;
-            }
-
-            public override float Get(int docID)
-            {
-                return J2N.BitConversion.Int32BitsToSingle((int)valuesIn.Get(docID));
-            }
-        }
-
         /// <summary>
         /// NOTE: This was FloatsFromArray in Lucene
         /// </summary>
@@ -1416,7 +1344,7 @@
             {
                 // Not cached here by FieldCacheImpl (cached instead
                 // per-thread by SegmentReader):
-                return new FieldCache_Int64sAnonymousInnerClassHelper(this, valuesIn);
+                return new FieldCache.Int64s(get: (docID) => valuesIn.Get(docID));
             }
             else
             {
@@ -1438,24 +1366,6 @@
             }
         }
 
-        private class FieldCache_Int64sAnonymousInnerClassHelper : FieldCache.Int64s
-        {
-            private readonly FieldCacheImpl outerInstance;
-
-            private NumericDocValues valuesIn;
-
-            public FieldCache_Int64sAnonymousInnerClassHelper(FieldCacheImpl outerInstance, NumericDocValues valuesIn)
-            {
-                this.outerInstance = outerInstance;
-                this.valuesIn = valuesIn;
-            }
-
-            public override long Get(int docID)
-            {
-                return valuesIn.Get(docID);
-            }
-        }
-
         /// <summary>
         /// NOTE: This was LongsFromArray in Lucene
         /// </summary>
@@ -1600,7 +1510,7 @@
             {
                 // Not cached here by FieldCacheImpl (cached instead
                 // per-thread by SegmentReader):
-                return new FieldCache_DoublesAnonymousInnerClassHelper(this, valuesIn);
+                return new FieldCache.Doubles(get: (docID) => J2N.BitConversion.Int64BitsToDouble(valuesIn.Get(docID)));
             }
             else
             {
@@ -1622,24 +1532,6 @@
             }
         }
 
-        private class FieldCache_DoublesAnonymousInnerClassHelper : FieldCache.Doubles
-        {
-            private readonly FieldCacheImpl outerInstance;
-
-            private NumericDocValues valuesIn;
-
-            public FieldCache_DoublesAnonymousInnerClassHelper(FieldCacheImpl outerInstance, NumericDocValues valuesIn)
-            {
-                this.outerInstance = outerInstance;
-                this.valuesIn = valuesIn;
-            }
-
-            public override double Get(int docID)
-            {
-                return J2N.BitConversion.Int64BitsToDouble(valuesIn.Get(docID));
-            }
-        }
-
         internal class DoublesFromArray : FieldCache.Doubles
         {
             private readonly double[] values;
