diff --git a/include/benchmark/benchmark.h b/include/benchmark/benchmark.h
index 89cea31..58c9c15 100644
--- a/include/benchmark/benchmark.h
+++ b/include/benchmark/benchmark.h
@@ -227,7 +227,7 @@
   int range_x() const;
   int range_y() const;
 
-  int iterations() const { return total_iterations_; }
+  int64_t iterations() const { return total_iterations_; }
 
   const int thread_index;
 
@@ -312,7 +312,7 @@
     bool cpu_scaling_enabled;
 
     // The number of chars in the longest benchmark name.
-    int name_field_width;
+    size_t name_field_width;
   };
 
   struct Run {
@@ -454,12 +454,12 @@
  private:
   friend class BenchmarkFamilies;
 
-  std::vector<Benchmark::Instance> CreateBenchmarkInstances(int rangeXindex,
-                                                            int rangeYindex);
+  std::vector<Benchmark::Instance> CreateBenchmarkInstances(size_t rangeXindex,
+                                                            size_t rangeYindex);
 
   std::string name_;
   BenchmarkFunction function_;
-  int registration_index_;
+  size_t registration_index_;
   std::vector<int> rangeX_;
   std::vector<int> rangeY_;
   std::vector<int> thread_counts_;
@@ -469,7 +469,8 @@
   static const int kNumCpuMarker = -1;
 
   // Special value used to indicate that no range is required.
-  static const int kNoRange = -1;
+  static const size_t kNoRangeIndex = std::numeric_limits<size_t>::max();
+  static const int kNoRange = std::numeric_limits<int>::max();
 
   static void AddRange(std::vector<int>* dst, int lo, int hi, int mult);
   static double MeasurePeakHeapMemory(const Instance& b);
@@ -494,7 +495,7 @@
  private:
   std::string PrintMemoryUsage(double bytes) const;
   virtual void PrintRunData(const Run& report) const;
-  mutable int name_field_width_;
+  mutable size_t name_field_width_;
 };
 
 }  // end namespace internal
diff --git a/src/benchmark.cc b/src/benchmark.cc
index 506f7c1..47e4919 100644
--- a/src/benchmark.cc
+++ b/src/benchmark.cc
@@ -91,10 +91,10 @@
               "SI and IEC unit arrays must be the same size");
 static_assert(arraysize(kSmallSIUnits) == arraysize(kBigSIUnits),
               "Small SI and Big SI unit arrays must be the same size");
-static const int kUnitsSize = arraysize(kBigSIUnits);
+static const size_t kUnitsSize = arraysize(kBigSIUnits);
 
 void ToExponentAndMantissa(double val, double thresh, int precision,
-                           double one_k, std::string* mantissa, int* exponent) {
+                           double one_k, std::string* mantissa, size_t* exponent) {
   std::stringstream mantissa_stream;
 
   if (val < 0) {
@@ -144,10 +144,10 @@
   *mantissa = mantissa_stream.str();
 }
 
-std::string ExponentToPrefix(int exponent, bool iec) {
+std::string ExponentToPrefix(size_t exponent, bool iec) {
   if (exponent == 0) return "";
 
-  const int index = (exponent > 0 ? exponent - 1 : -exponent - 1);
+  const size_t index = (exponent > 0 ? exponent - 1 : -exponent - 1);
   if (index >= kUnitsSize) return "";
 
   const char* array =
@@ -161,7 +161,7 @@
 std::string ToBinaryStringFullySpecified(double value, double threshold,
                                          int precision) {
   std::string mantissa;
-  int exponent;
+  size_t exponent;
   ToExponentAndMantissa(value, threshold, precision, 1024.0, &mantissa,
                         &exponent);
   return mantissa + ExponentToPrefix(exponent, false);
@@ -311,10 +311,10 @@
   static BenchmarkFamilies* GetInstance();
 
   // Registers a benchmark family and returns the index assigned to it.
-  int AddBenchmark(Benchmark* family);
+  size_t AddBenchmark(Benchmark* family);
 
   // Unregisters a family at the given index.
-  void RemoveBenchmark(int index);
+  void RemoveBenchmark(size_t index);
 
   // Extract the list of benchmark instances that match the specified
   // regular expression.
@@ -341,7 +341,7 @@
   }
 }
 
-int BenchmarkFamilies::AddBenchmark(Benchmark* family) {
+size_t BenchmarkFamilies::AddBenchmark(Benchmark* family) {
   std::lock_guard<std::mutex> l(mutex_);
   // This loop attempts to reuse an entry that was previously removed to avoid
   // unncessary growth of the vector.
@@ -351,12 +351,12 @@
       return index;
     }
   }
-  int index = families_.size();
+  size_t index = families_.size();
   families_.push_back(family);
   return index;
 }
 
-void BenchmarkFamilies::RemoveBenchmark(int index) {
+void BenchmarkFamilies::RemoveBenchmark(size_t index) {
   std::lock_guard<std::mutex> l(mutex_);
   families_[index] = NULL;
   // Don't shrink families_ here, we might be called by the destructor of
@@ -389,12 +389,13 @@
     std::vector<Benchmark::Instance> instances;
     if (family->rangeX_.empty() && family->rangeY_.empty()) {
       instances = family->CreateBenchmarkInstances(
-        Benchmark::kNoRange, Benchmark::kNoRange);
+        Benchmark::kNoRangeIndex, Benchmark::kNoRangeIndex);
       std::copy(instances.begin(), instances.end(),
                 std::back_inserter(*benchmarks));
     } else if (family->rangeY_.empty()) {
       for (size_t x = 0; x < family->rangeX_.size(); ++x) {
-        instances = family->CreateBenchmarkInstances(x, Benchmark::kNoRange);
+        instances = family->CreateBenchmarkInstances(
+          x, Benchmark::kNoRangeIndex);
         std::copy(instances.begin(), instances.end(),
                   std::back_inserter(*benchmarks));
       }
@@ -440,7 +441,7 @@
   }
 
   int output_width = fprintf(stdout, "%s%-*s %10s %10s %10s\n",
-                             Prefix(), name_field_width_, "Benchmark",
+                             Prefix(), int(name_field_width_), "Benchmark",
                              "Time(ns)", "CPU(ns)", "Iterations");
   std::cout << std::string(output_width - 1, '-').c_str() << "\n";
 
@@ -794,7 +795,7 @@
 }
 
 std::vector<Benchmark::Instance> Benchmark::CreateBenchmarkInstances(
-    int rangeXindex, int rangeYindex) {
+    size_t rangeXindex, size_t rangeYindex) {
   // Special list of thread counts to use when none are specified
   std::vector<int> one_thread;
   one_thread.push_back(1);
@@ -810,12 +811,12 @@
     instance.bm = this;
     instance.threads = num_threads;
 
-    if (rangeXindex != kNoRange) {
+    if (rangeXindex != kNoRangeIndex) {
       instance.rangeX = rangeX_[rangeXindex];
       instance.rangeXset = true;
       AppendHumanReadable(instance.rangeX, &instance.name);
     }
-    if (rangeYindex != kNoRange) {
+    if (rangeYindex != kNoRangeIndex) {
       instance.rangeY = rangeY_[rangeYindex];
       instance.rangeYset = true;
       AppendHumanReadable(instance.rangeY, &instance.name);
@@ -1231,20 +1232,21 @@
 
   // Determine the width of the name field using a minimum width of 10.
   // Also determine max number of threads needed.
-  int name_field_width = 10;
+  size_t name_field_width = 10;
   for (const internal::Benchmark::Instance& benchmark : benchmarks) {
     // Add width for _stddev and threads:XX
     if (benchmark.threads > 1 && FLAGS_benchmark_repetitions > 1) {
       name_field_width =
-          std::max<int>(name_field_width, benchmark.name.size() + 17);
+          std::max<size_t>(name_field_width, benchmark.name.size() + 17);
     } else if (benchmark.threads > 1) {
       name_field_width =
-          std::max<int>(name_field_width, benchmark.name.size() + 10);
+          std::max<size_t>(name_field_width, benchmark.name.size() + 10);
     } else if (FLAGS_benchmark_repetitions > 1) {
       name_field_width =
-          std::max<int>(name_field_width, benchmark.name.size() + 7);
+          std::max<size_t>(name_field_width, benchmark.name.size() + 7);
     } else {
-      name_field_width = std::max<int>(name_field_width, benchmark.name.size());
+      name_field_width =
+          std::max<size_t>(name_field_width, benchmark.name.size());
     }
   }
 
diff --git a/src/sysinfo.cc b/src/sysinfo.cc
index e907cc3..2d1ce24 100644
--- a/src/sysinfo.cc
+++ b/src/sysinfo.cc
@@ -55,7 +55,7 @@
 #if defined OS_LINUX || defined OS_CYGWIN
 // Helper function for reading an int from a file. Returns true if successful
 // and the memory location pointed to by value is set to the value read.
-bool ReadIntFromFile(const char* file, int* value) {
+bool ReadIntFromFile(const char* file, long* value) {
   bool ret = false;
   int fd = open(file, O_RDONLY);
   if (fd != -1) {
@@ -63,7 +63,7 @@
     char* err;
     memset(line, '\0', sizeof(line));
     CHECK(read(fd, line, sizeof(line) - 1));
-    const int temp_value = strtol(line, &err, 10);
+    const long temp_value = strtol(line, &err, 10);
     if (line[0] != '\0' && (*err == '\n' || *err == '\0')) {
       *value = temp_value;
       ret = true;
@@ -78,7 +78,7 @@
 #if defined OS_LINUX || defined OS_CYGWIN
   char line[1024];
   char* err;
-  int freq;
+  long freq;
 
   bool saw_mhz = false;
 
@@ -120,13 +120,13 @@
 
   double bogo_clock = 1.0;
   bool saw_bogo = false;
-  int max_cpu_id = 0;
+  long max_cpu_id = 0;
   int num_cpus = 0;
   line[0] = line[1] = '\0';
-  int chars_read = 0;
+  size_t chars_read = 0;
   do {  // we'll exit when the last read didn't read anything
     // Move the next line to the beginning of the buffer
-    const int oldlinelen = strlen(line);
+    const size_t oldlinelen = strlen(line);
     if (sizeof(line) == oldlinelen + 1)  // oldlinelen took up entire line
       line[0] = '\0';
     else  // still other lines left to save
@@ -134,8 +134,8 @@
     // Terminate the new line, reading more if we can't find the newline
     char* newline = strchr(line, '\n');
     if (newline == NULL) {
-      const int linelen = strlen(line);
-      const int bytes_to_read = sizeof(line) - 1 - linelen;
+      const size_t linelen = strlen(line);
+      const size_t bytes_to_read = sizeof(line) - 1 - linelen;
       CHECK(bytes_to_read > 0);  // because the memmove recovered >=1 bytes
       chars_read = read(fd, line + linelen, bytes_to_read);
       line[linelen + chars_read] = '\0';
@@ -164,7 +164,7 @@
       num_cpus++;  // count up every time we see an "processor :" entry
       const char* freqstr = strchr(line, ':');
       if (freqstr) {
-        const int cpu_id = strtol(freqstr + 1, &err, 10);
+        const long cpu_id = strtol(freqstr + 1, &err, 10);
         if (freqstr[1] != '\0' && *err == '\0' && max_cpu_id < cpu_id)
           max_cpu_id = cpu_id;
       }
diff --git a/test/benchmark_test.cc b/test/benchmark_test.cc
index 2600665..ba2e9d8 100644
--- a/test/benchmark_test.cc
+++ b/test/benchmark_test.cc
@@ -162,7 +162,7 @@
 
   virtual ~TestReporter() {}
 
-  int GetCount() const {
+  size_t GetCount() const {
     return count_;
   }
 
